IOS開發(fā)架構(gòu)封裝異步請(qǐng)求案例實(shí)現(xiàn)
IOS開發(fā)架構(gòu)封裝異步請(qǐng)求案例實(shí)現(xiàn)是本文要介紹的內(nèi)容,主要是實(shí)現(xiàn)IOS開發(fā)中異步請(qǐng)求的封裝案例,來看本文詳細(xì)內(nèi)容講解。
在找IOS開發(fā)相關(guān)的內(nèi)容是,看到本文,與朋友們分享一下。論壇里看到一位兄臺(tái)的問題:”異步請(qǐng)求能不能封裝誠(chéng)一個(gè)公用的類?每個(gè)頁面都要copy一下幾個(gè)方法,感覺很麻煩“可能很多人也會(huì)有相同的問題,于是起一篇博客專門談?wù)勥@個(gè)問題,主要想闡述一下編程思想及架構(gòu)設(shè)計(jì),權(quán)當(dāng)拋磚引玉。閑話不多說,直接上代碼:
- MyURLClass.h
- #import <Foundation/Foundation.h>
- @interface MyURLClass : NSObject {
- @private
- NSMutableSet *mDelegates;
- NSMutableData *mData;
- }
- - (void) addDelegate:(id)delegate;
- - (void) removeDelegate:(id)delegate;
- @end
- #import <Foundation/Foundation.h>
- @interface MyURLClass : NSObject {
- @private
- NSMutableSet *mDelegates;
- NSMutableData *mData;
- }
- - (void) addDelegate:(id)delegate;
- - (void) removeDelegate:(id)delegate;
- @end
- MyURLClass.m
- @implementation MyURLClass
- - (id)init {
- [super init];
- mDelegates = [NSMutableSet new];
- mData = [NSMutableData new];
- return self;
- }
- - (void) addDelegate:(id)delegate {
- [mDelegates addObject:delegate];
- }
- - (void) removeDelegate:(id)delegate{
- [mDelegates removeObject:delegate];
- }
- - (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data {
- [mData appendData:data];
- }
- - (void) connectionDidFinishLoading : (NSURLConnection *) connection {
- NSLog(@"delegate:%@", mDelegates);
- SEL seltor = @selector(finishWithData:);
- NSSet * set = [[NSSet alloc] initWithSet:mDelegates];
- for (id del in set) {
- if ([del respondsToSelector:seltor])
- [del performSelector:seltor withObject:mData];
- }
- [set release];
- }
- @end
- @implementation MyURLClass
- - (id)init {
- [super init];
- mDelegates = [NSMutableSet new];
- mData = [NSMutableData new];
- return self;
- }
- - (void) addDelegate:(id)delegate {
- [mDelegates addObject:delegate];
- }
- - (void) removeDelegate:(id)delegate{
- [mDelegates removeObject:delegate];
- }
- - (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data {
- [mData appendData:data];
- }
- - (void) connectionDidFinishLoading : (NSURLConnection *) connection {
- NSLog(@"delegate:%@", mDelegates);
- SEL seltor = @selector(finishWithData:);
- NSSet * set = [[NSSet alloc] initWithSet:mDelegates];
- for (id del in set) {
- if ([del respondsToSelector:seltor])
- [del performSelector:seltor withObject:mData];
- }
- [set release];
- }
- @end
至此,我的“異步請(qǐng)求類”就封裝好了,mDelegates是用來保存請(qǐng)求對(duì)象(即發(fā)送異步請(qǐng)求的那個(gè)類的對(duì)象)的,以便在異步connectionDidFinishLoading的時(shí)候調(diào)用回調(diào)方法,繼續(xù):
- - (IBAction)sendMyRequest {
- NSURL *url = [NSURL URLWithString:@"http://www.csdn.net"];
- NSURLRequest *mRequest = [NSURLRequest requestWithURL:url];
- MyURLClass *urlClass = [[MyURLClass alloc] init];
- [urlClass addDelegate:self];
- [[NSURLConnection alloc] initWithRequest:mRequest delegate:urlClass startImmediately:YES];
- }
- - (void)finishWithData:(NSData *)data {
- NSLog(@"%@", data);
- }
- - (IBAction)sendMyRequest {
- NSURL *url = [NSURL URLWithString:@"http://www.csdn.net"];
- NSURLRequest *mRequest = [NSURLRequest requestWithURL:url];
- MyURLClass *urlClass = [[MyURLClass alloc] init];
- [urlClass addDelegate:self];
- [[NSURLConnection alloc] initWithRequest:mRequest delegate:urlClass startImmediately:YES];
- }
- - (void)finishWithData:(NSData *)data {
- NSLog(@"%@", data);
- }
上面這段代碼就是發(fā)送請(qǐng)求類的主要一段代碼
1、點(diǎn)擊按鈕后,新建一個(gè)MyURLClass類的對(duì)象,然后將自己添加到MyURLClass的mDelegates中,之后發(fā)送異步請(qǐng)求,并且發(fā)送請(qǐng)求的delegate設(shè)為MyURLClass的對(duì)象
2、請(qǐng)求響應(yīng)后,就會(huì)調(diào)用MyURLClass類中的connectionDidFinishLoading方法,在這個(gè)方法中會(huì)找到發(fā)送請(qǐng)求類的對(duì)象,并且調(diào)用他的finishWithData方法,同時(shí)傳遞mData這個(gè)參數(shù),至此,一個(gè)完整的http通信結(jié)束,當(dāng)然不要忘了請(qǐng)求結(jié)束把自己從set中移除(調(diào)用removeDelegate:self)
上面的代碼只是我寫的一個(gè)小例子,主要為了體現(xiàn)思想,真正要是封裝并且運(yùn)用到項(xiàng)目中的時(shí)候一定要注意:1、在addDelegate和removeDelegate的時(shí)候需要加鎖;2、應(yīng)該先進(jìn)行數(shù)據(jù)處理,比如轉(zhuǎn)換為NSDictionary在傳遞給finishWithData,當(dāng)然,不要忘了改finishWithData的參數(shù)類型;3、如果你不想所有的回調(diào)方法名都叫finishWithData,那你可以做一個(gè)關(guān)系映射(struct和NSDictionary都可以滿足你的需求),分別存儲(chǔ)每個(gè)類與回調(diào)方法名的對(duì)應(yīng),同時(shí)需要修改SEL seltor = @selector(finishWithData:);這里的實(shí)現(xiàn);4、如果你要寫一個(gè)封裝好的MyURLClass,一定要做成一個(gè)全局對(duì)象,千萬不要想我上面那樣在sendMyRequest中現(xiàn)alloc。
其實(shí)能封裝的地方還有很多,比如sendMyRequest這個(gè)方法就很有被封裝的潛力。
小結(jié):IOS開發(fā)架構(gòu)封裝異步請(qǐng)求案例實(shí)現(xiàn)的內(nèi)容介紹完了,就是簡(jiǎn)單介紹了一下一個(gè)小架構(gòu),***希望通過本文的學(xué)習(xí)能對(duì)你有所幫助!