免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1134 | 回复: 1
打印 上一主题 下一主题

大家的程序框架都怎么样的啊 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-03-02 09:00 |只看该作者 |倒序浏览
大家的程序框架都怎么样的啊






兄弟们,大家的程序框架都怎么样的啊?



我的是这样的:

BusinessController

BusinessService

BusinessListener

主要就这三个, 供其它的service和controller 继承。



BusinessController实现BusinessListener这个协议

BusinessService是BusinessController的成员变量,初始化的时候需要一个BusinessListener,一般传self

BusinessController主要就是发起网络异步请求 ,回来的时候通知初始化的时候需要一个BusinessListener



缺点:

1. 发起请求后,假如controller 立即释放 比如马上返回,这样回调的时候程序会爆掉。  需要在BusinessController 的dealloc方法里  把BusinessService 的 BusinessListener 设成nil

C代码
  1. -(void) dealloc   
  2. {   
  3.     if([self.service isKindOfClass:[BusinessService class]])   
  4.         ((NDKBusinessService *)self.service).businessListener = nil;   
  5.         。。。   
  6.         。。。   
  7. }   
  8.      

  9. -(void) dealloc
  10. {
  11.     if([self.service isKindOfClass:[BusinessService class]])
  12.         ((NDKBusinessService *)self.service).businessListener = nil;
  13.         。。。
复制代码
。。。
}
   

2. 由于发出网络请求后,都会回到同一个回调方法。。。所以会有一堆的判断,以区别不同的请求, 比如


C代码
  1. -(void) recentItems   
  2. {   
  3.     actionType = ACTION_RECENT_ITEMS;   
  4.      
  5.     //send request   
  6. }   
  7.   
  8. - (void)requestFinished:(ASIHTTPRequest *)request   
  9. {   
  10.     [super requestFinished:request];   
  11.         switch (actionType)   
  12.         {   
  13.             case ACTION_RECENT_ITEMS:   
  14.                 [self parseRecentItems:dict];   
  15.                 break;   
  16.             case ACTION_RECENT_ITEMS_AWAKE_FROM_BACK:   
  17.                 [self parseRecentItems:dict];   
  18.                 break;   
  19.             。。。   
  20.             。。。   
  21. }  

  22. -(void) recentItems
  23. {
  24.     actionType = ACTION_RECENT_ITEMS;
  25.   
  26.     //send request
  27. }

  28. - (void)requestFinished:(ASIHTTPRequest *)request
  29. {
  30.     [super requestFinished:request];
  31.                 switch (actionType)
  32.         {
  33.             case ACTION_RECENT_ITEMS:
  34.                 [self parseRecentItems:dict];
  35.                 break;
  36.             case ACTION_RECENT_ITEMS_AWAKE_FROM_BACK:
  37.                 [self parseRecentItems:dict];
  38.                 break;
  39.                         。。。
  40.                         。。。
复制代码
}  


3. 同时发起多个异步请求不方便。 需要线性发送。  这个是这个框架的最大的问题。

   举例说明:


C代码
  1. self.service = [SerciceA alloc] initWithLisener:self];   
  2. [self.server invokeA]; //1   
  3.       
  4. self.service = [SerciceB alloc] initWithLisener:self];//2   
  5. [self.service invokeB]; //3  

  6. self.service = [SerciceA alloc] initWithLisener:self];
  7. [self.server invokeA]; //1
  8.        
  9. self.service = [SerciceB alloc] initWithLisener:self];//2
  10. [self.service invokeB]; //3  
  11.        
复制代码
用NSURLConnection没问题,用ASIHTTPRequest 会爆掉的,不信你可以试试,哈哈。。

        原因是执行//3 的时候 SerciceA貌似会被release掉,没有被某个thread retain 住

       



替换方案:

1. 专门弄个thread, 开一个runloop, 专门用来发送请求和回调给controller.

   这样做的好处有二

   1). 省去了一堆的 actionType,因为是同步方法了

   2). 可以同时发送多个请求。。。让runloop 来retain 那个service



   缺点:

   让runloop 发送请求的时候,传参数太麻烦了。。。

        一般是这样的: 【self performSelector: onThread: withObject:waitUntilDone:]   看到withObject , 我表示很不淡定

2. 把异步请求全部改成同步请求

论坛徽章:
0
2 [报告]
发表于 2012-03-02 11:55 |只看该作者
谢谢分享
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP