ios的一個架構小例子—非同步請求的封裝

來源:互聯網
上載者:User

論壇裡看到一位兄台的問題:”非同步請求能不能封裝誠一個公用的類?每個頁面都要copy一下幾個方法,感覺很麻煩“

可能很多人也會有相同的問題,於是起一篇部落格專門談談這個問題,主要想闡述一下編程思想及架構設計,權當拋磚引玉。閑話不多說,直接上代碼:

MyURLClass.h

#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

至此,我的“非同步請求類”就封裝好了,mDelegates是用來儲存請求對象(即發送非同步請求的那個類的對象)的,以便在非同步connectionDidFinishLoading的時候調用回調方法,繼續:

- (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); }

上面這段代碼就是發送請求類的主要一段代碼

1、點擊按鈕後,建立一個MyURLClass類的對象,然後將自己添加到MyURLClass的mDelegates中,之後發送非同步請求,並且發送請求的delegate設為MyURLClass的對象

2、請求響應後,就會調用MyURLClass類中的connectionDidFinishLoading方法,在這個方法中會找到發送請求類的對象,並且調用他的finishWithData方法,同時傳遞mData這個參數,至此,一個完整的http通訊結束,當然不要忘了請求結束把自己從set中移除(調用removeDelegate:self)

上面的代碼只是我寫的一個小例子,主要為了體現思想,真正要是封裝並且運用到項目中的時候一定要注意:1、在addDelegate和removeDelegate的時候需要加鎖;2、應該先進行資料處理,比如轉換為NSDictionary在傳遞給finishWithData,當然,不要忘了改finishWithData的參數類型;3、如果你不想所有的回調方法名都叫finishWithData,那你可以做一個關係映射(struct和NSDictionary都可以滿足你的需求),分別儲存每個類與回調方法名的對應,同時需要修改SEL
seltor = @selector(finishWithData:);這裡的實現;4、如果你要寫一個封裝好的MyURLClass,一定要做成一個全域對象,千萬不要想我上面那樣在sendMyRequest中現alloc。

其實能封裝的地方還有很多,比如sendMyRequest這個方法就很有被封裝的潛力。

簡單介紹了一下一個小架構,希望會對大家有所協助,也歡迎大家討論。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.