- 论坛徽章:
- 0
|
大家的程序框架都怎么样的啊
兄弟们,大家的程序框架都怎么样的啊?
我的是这样的:
BusinessController
BusinessService
BusinessListener
主要就这三个, 供其它的service和controller 继承。
BusinessController实现BusinessListener这个协议
BusinessService是BusinessController的成员变量,初始化的时候需要一个BusinessListener,一般传self
BusinessController主要就是发起网络异步请求 ,回来的时候通知初始化的时候需要一个BusinessListener
缺点:
1. 发起请求后,假如controller 立即释放 比如马上返回,这样回调的时候程序会爆掉。 需要在BusinessController 的dealloc方法里 把BusinessService 的 BusinessListener 设成nil
C代码- -(void) dealloc
- {
- if([self.service isKindOfClass:[BusinessService class]])
- ((NDKBusinessService *)self.service).businessListener = nil;
- 。。。
- 。。。
- }
-
- -(void) dealloc
- {
- if([self.service isKindOfClass:[BusinessService class]])
- ((NDKBusinessService *)self.service).businessListener = nil;
- 。。。
复制代码 。。。
}
2. 由于发出网络请求后,都会回到同一个回调方法。。。所以会有一堆的判断,以区别不同的请求, 比如
C代码- -(void) recentItems
- {
- actionType = ACTION_RECENT_ITEMS;
-
- //send request
- }
-
- - (void)requestFinished:(ASIHTTPRequest *)request
- {
- [super requestFinished:request];
- switch (actionType)
- {
- case ACTION_RECENT_ITEMS:
- [self parseRecentItems:dict];
- break;
- case ACTION_RECENT_ITEMS_AWAKE_FROM_BACK:
- [self parseRecentItems:dict];
- break;
- 。。。
- 。。。
- }
- -(void) recentItems
- {
- actionType = ACTION_RECENT_ITEMS;
-
- //send request
- }
- - (void)requestFinished:(ASIHTTPRequest *)request
- {
- [super requestFinished:request];
- switch (actionType)
- {
- case ACTION_RECENT_ITEMS:
- [self parseRecentItems:dict];
- break;
- case ACTION_RECENT_ITEMS_AWAKE_FROM_BACK:
- [self parseRecentItems:dict];
- break;
- 。。。
- 。。。
复制代码 }
3. 同时发起多个异步请求不方便。 需要线性发送。 这个是这个框架的最大的问题。
举例说明:
C代码- self.service = [SerciceA alloc] initWithLisener:self];
- [self.server invokeA]; //1
-
- self.service = [SerciceB alloc] initWithLisener:self];//2
- [self.service invokeB]; //3
- self.service = [SerciceA alloc] initWithLisener:self];
- [self.server invokeA]; //1
-
- self.service = [SerciceB alloc] initWithLisener:self];//2
- [self.service invokeB]; //3
-
复制代码 用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. 把异步请求全部改成同步请求
|
|