IOS开发架构封装异步请求案例实现

移动开发 iOS
IOS开发架构封装异步请求案例实现是本文要介绍的内容,主要是实现IOS开发中异步请求的封装案例,来看本文详细内容讲解。

IOS开发架构封装异步请求案例实现是本文要介绍的内容,主要是实现IOS开发异步请求的封装案例,来看本文详细内容讲解。

在找IOS开发相关的内容是,看到本文,与朋友们分享一下。论坛里看到一位兄台的问题:”异步请求能不能封装诚一个公用的类?每个页面都要copy一下几个方法,感觉很麻烦“可能很多人也会有相同的问题,于是起一篇博客专门谈谈这个问题,主要想阐述一下编程思想及架构设计,权当抛砖引玉。闲话不多说,直接上代码:

  1. MyURLClass.h  
  2.  
  3. #import <Foundation/Foundation.h>     
  4.     
  5.     
  6. @interface MyURLClass : NSObject {    
  7.         
  8. @private    
  9.     NSMutableSet *mDelegates;    
  10.     NSMutableData *mData;    
  11. }    
  12.     
  13. - (void) addDelegate:(id)delegate;    
  14. - (void) removeDelegate:(id)delegate;    
  15.     
  16. @end    
  17. #import <Foundation/Foundation.h> 
  18.  
  19.  
  20. @interface MyURLClass : NSObject {  
  21.       
  22. @private  
  23.     NSMutableSet *mDelegates;  
  24.     NSMutableData *mData;  
  25. }  
  26.  
  27. - (void) addDelegate:(id)delegate;  
  28. - (void) removeDelegate:(id)delegate;  
  29.  
  30. @end  
  31. MyURLClass.m  
  32.  
  33. @implementation MyURLClass    
  34.     
  35. - (id)init {    
  36.     [super init];    
  37.     mDelegates = [NSMutableSet new];    
  38.     mData = [NSMutableData new];    
  39.     return self;    
  40. }    
  41.     
  42. - (void) addDelegate:(id)delegate {    
  43.     [mDelegates addObject:delegate];    
  44. }    
  45. - (void) removeDelegate:(id)delegate{    
  46.     [mDelegates removeObject:delegate];    
  47. }    
  48.     
  49. - (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data {    
  50.     [mData appendData:data];    
  51. }    
  52.     
  53. - (void) connectionDidFinishLoading : (NSURLConnection *) connection {    
  54.     NSLog(@"delegate:%@", mDelegates);    
  55.     SEL seltor = @selector(finishWithData:);    
  56.     NSSet * set = [[NSSet alloc] initWithSet:mDelegates];    
  57.     for (id del in set) {    
  58.             
  59.         if ([del respondsToSelector:seltor])    
  60.             [del performSelector:seltor withObject:mData];    
  61.     }    
  62.     [set release];    
  63. }    
  64.     
  65. @end    
  66. @implementation MyURLClass  
  67.  
  68. - (id)init {  
  69.     [super init];  
  70.     mDelegates = [NSMutableSet new];  
  71.     mData = [NSMutableData new];  
  72.     return self;  
  73. }  
  74.  
  75. - (void) addDelegate:(id)delegate {  
  76.     [mDelegates addObject:delegate];  
  77. }  
  78. - (void) removeDelegate:(id)delegate{  
  79.     [mDelegates removeObject:delegate];  
  80. }  
  81.  
  82. - (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data {  
  83.  [mData appendData:data];  
  84. }  
  85.  
  86. - (void) connectionDidFinishLoading : (NSURLConnection *) connection {  
  87.     NSLog(@"delegate:%@", mDelegates);  
  88.     SEL seltor = @selector(finishWithData:);  
  89.     NSSet * set = [[NSSet alloc] initWithSet:mDelegates];  
  90.     for (id del in set) {  
  91.           
  92.         if ([del respondsToSelector:seltor])  
  93.             [del performSelector:seltor withObject:mData];  
  94.     }  
  95.     [set release];  
  96. }  
  97. @end 

至此,我的“异步请求类”就封装好了,mDelegates是用来保存请求对象(即发送异步请求的那个类的对象)的,以便在异步connectionDidFinishLoading的时候调用回调方法,继续:

  1. - (IBAction)sendMyRequest {    
  2.     NSURL *url = [NSURL URLWithString:@"http://www.csdn.net"];    
  3.     NSURLRequest *mRequest = [NSURLRequest requestWithURL:url];    
  4.         
  5.     MyURLClass *urlClass = [[MyURLClass alloc] init];    
  6.     [urlClass addDelegate:self];    
  7.     [[NSURLConnection alloc] initWithRequest:mRequest delegate:urlClass startImmediately:YES];    
  8. }    
  9.     
  10. - (void)finishWithData:(NSData *)data {    
  11.     NSLog(@"%@", data);    
  12.  }    
  13. - (IBAction)sendMyRequest {  
  14.     NSURL *url = [NSURL URLWithString:@"http://www.csdn.net"];  
  15.     NSURLRequest *mRequest = [NSURLRequest requestWithURL:url];  
  16.       
  17.     MyURLClass *urlClass = [[MyURLClass alloc] init];  
  18.     [urlClass addDelegate:self];  
  19.     [[NSURLConnection alloc] initWithRequest:mRequest delegate:urlClass startImmediately:YES];  
  20. }  
  21.  
  22. - (void)finishWithData:(NSData *)data {  
  23.     NSLog(@"%@", data);  
  24.  } 

上面这段代码就是发送请求类的主要一段代码

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这个方法就很有被封装的潜力。

小结:IOS开发架构封装异步请求案例实现的内容介绍完了,就是简单介绍了一下一个小架构,***希望通过本文的学习能对你有所帮助!

责任编辑:zhaolei 来源: 互联网
相关推荐

2022-03-02 15:31:32

架构网络请求代码

2013-03-28 14:11:10

iOS异步GET方法请

2012-03-01 20:32:29

iOS

2011-08-03 10:39:06

IOS程序 HTTP 请求

2023-07-06 08:10:57

Vue3参数请求

2011-08-19 15:09:00

IOS开发

2011-08-17 14:30:34

iOS开发窗口

2011-08-16 14:59:31

IOS开发ViewDidUnloiOS 5

2015-06-02 09:51:40

iOS网络请求封装接口

2011-08-18 13:58:34

iPhone开发NSOperation异步

2011-08-15 15:44:46

iPhone开发PDF

2011-08-18 16:24:44

iPhone开发图片

2011-08-22 16:08:46

IOS开发数据库

2021-09-26 06:43:07

封装网络请求

2023-09-18 07:46:28

2017-12-25 14:59:47

APP架构iOS协议

2024-07-31 15:57:41

2024-10-15 10:28:43

2011-08-19 10:13:05

iPhone开发

2011-08-19 11:10:31

iPhone应用
点赞
收藏

51CTO技术栈公众号