我正在使用Objective-C中的网络请求 - 响应。我不明白有异步模型的东西。
总之,我有一个观点,将显示来自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个项目,计数的输出是否会大于10?
如果只有一个单独的线程,那么线程如何完成解析1响应并跳转到另一个响应因为,IMO,线程只是后续执行,代码块按代码块
答案 0 :(得分:1)
是的,每个网络请求可能有一个线程。诀窍是处理主线程上的响应。你应该有这样的东西:
- (void)helper:(id <NCHelper>)helper didReturnItems:(NSArray *)items;
{
[self performSelectorOnMainThread:@selector(helperDidFinishGettingMyItems:)
withObject:items
waitUntilDone:NO];
}
将响应放回主线程将避免一大堆多线程问题。
此外,count的输出永远不会大于10.只是多个线程可能同时运行 helperDidFinishGettingMyItems:
。它们不会自动组合两个数组。
计数器可能超过10,因为多个线程可能会同时增加ivar。