我正在使用Objective-C中的网络请求 - 响应。有一些我不明白的异步模型。Objective-C中网络的异步回调Iphone
总之,我有一个观点,将显示我的2个社交网络的状态:Twitter和Facebook。当我点击刷新时,它会调用模型管理器。那位模特经理会打电话给2位服务助手索要最新的物品。当2个服务助手接收到数据时,它将回传给模型管理器,并且该模型将所有数据添加到排序后的数组中。
我在这里不理解的是:当社交网络的响应回来时,有多少线程会处理响应。根据我对多线程和网络的理解(使用Java),必须有2个线程处理2个响应,这2个线程将执行代码以将响应添加到数组中。那么,它可能有竞争条件,程序可能会出错?它是iphone objective-C的正确工作模式吗?或者他们用不同的方式来完成它不会有竞争条件,我们不必关心锁定,同步?
这里是我的示例代码:
ModelManager.m
- (void)updateMyItems:(NSArray *)items {
self.helpers = [self authenticatedHelpersForAction:NCHelperActionGetMyItems];
for (id<NCHelper> helper in self.helpers) {
[helper updateMyItems:items]; // NETWORK request here
}
}
- (void)helper:(id <NCHelper>)helper didReturnItems:(NSArray *)items {
[self helperDidFinishGettingMyItems:items callback:@selector(model:didGetMyItems:)];
break;
}
}
// some private attributes
int *_currentSocialNetworkItemsCount = 0; // to count the number of items of a social network
- (void)helperDidFinishGettingMyItems:(NSArray *)items {
for (Item *item in items) {
_currentSocialNetworkItemsCount ++;
}
NSLog(@"count: %d", _currentSocialNetworkItemsCount);
_currentSocialNetworkItemsCount = 0;
}
我想问一下是否有该方法helperDidFinishGettingMyItems被同时调用情况。这意味着,例如,faceboook会返回10个项目,twitter会返回10个项目,count的输出将会大于10吗?
如果只有一个单一的线程,如何可以在线程完成通过的代码
如果我们把它放回主线程,它会冻结我们的屏幕? “只是多个线程可能同时运行helperDidFinishGettingMyItems:它们不会自动组合这两个数组。” 我不明白这一点。如果两个线程同时运行该方法并同时运行for循环,并且我的计数器是对象的属性(它是共享的),我认为它可以高达10以上我错过了什么? – vodkhang 2010-05-11 03:33:24
冻结是由等待响应引起的,但这就是您在后台线程中等待的原因。一旦响应到达,冻结完成,所以主线程可以处理响应。你是对的,柜台可能超过10个。对不起,我没有意识到柜台是伊娃。 – 2010-05-11 05:05:22