Objective-C Iphone中的网络异步回调

Objective-C Iphone中的网络异步回调,iphone,objective-c,multithreading,asynchronous,Iphone,Objective C,Multithreading,Asynchronous,我正在Objective-C中处理网络请求-响应。异步模型有一些我不理解的地方 总之,我有一个视图可以显示我在两个社交网络上的状态:Twitter和Facebook。当我单击“刷新”时,它将调用模型管理器。该型号经理将呼叫2名服务助手请求最新的项目。当两个服务助手收到数据时,数据将传回模型管理器,该模型将把所有数据添加到一个排序的数组中 我不明白的是:当来自社交网络的响应返回时,有多少线程将处理该响应。根据我对多线程和网络(Java)的理解,必须有两个线程处理两个响应,这两个线程将执行代码以将响

我正在Objective-C中处理网络请求-响应。异步模型有一些我不理解的地方

总之,我有一个视图可以显示我在两个社交网络上的状态:Twitter和Facebook。当我单击“刷新”时,它将调用模型管理器。该型号经理将呼叫2名服务助手请求最新的项目。当两个服务助手收到数据时,数据将传回模型管理器,该模型将把所有数据添加到一个排序的数组中

我不明白的是:当来自社交网络的响应返回时,有多少线程将处理该响应。根据我对多线程和网络(Java)的理解,必须有两个线程处理两个响应,这两个线程将执行代码以将响应添加到数组中。所以,它可能有比赛条件,程序可能会出错,对吗?这是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;
}
-(void)updateMyItems:(NSArray*)项{
self.helpers=[self-authenticatedHelpersForAction:NCHelperActionGetMyItems];
for(self.helpers中的id helper){
[helper updateMyItems:items];//此处为网络请求
}
}
-(void)helper:(id)helper didReturnItems:(NSArray*)项{
[self-helperDidFinishGettingMyItems:items回调:@selector(型号:didGetMyItems:)];
打破
}
}
//一些私人属性
int*\u currentSocialNetworkItemsCount=0;//计算社交网络的项目数
-(void)helperdFinishGettingMyItems:(NSArray*)项{
用于(项目*项目中的项目){
_currentSocialNetworkItemsCount++;
}            
NSLog(@“计数:%d”,\u currentSocialNetworkItemsCount);
_currentSocialNetworkItemsCount=0;
}
我想询问是否存在同时调用helperDidFinishGettingMyItems方法的情况。这意味着,例如,faceboook返回10个项目,twitter返回10个项目,count的输出是否会大于10


如果只有一个线程,该线程如何完成对一个响应的解析并跳转到另一个响应,因为在我看来,线程只是依次执行的,一个代码块一个代码块

是的,每个网络请求可能有一个线程。诀窍是在主线程上处理响应。你应该有这样的东西:

- (void)helper:(id <NCHelper>)helper didReturnItems:(NSArray *)items;
{
    [self performSelectorOnMainThread:@selector(helperDidFinishGettingMyItems:)
                           withObject:items
                        waitUntilDone:NO];
}
-(void)helper:(id)helper didReturnItems:(NSArray*)项;
{
[self-performSelectorOnMainThread:@selector(helperDidFinishGettingMyItems:)
withObject:项目
waitUntilDone:没有];
}
将响应放回主线程将避免一大堆多线程问题

此外,count的输出永远不会大于10。只是多个线程可能同时运行
helperdFinishGettingMyItems:
。它们不会自动组合这两个阵列


计数器可能超过10,因为多个线程可能同时增加该ivar。

如果我们将其放回主线程,它会冻结屏幕吗?“只是多个线程可能同时运行helperDiFinishGettingMyItems:。它们不会自动组合这两个数组。”我不明白这一点。如果两个线程同时运行该方法并同时运行for循环,并且我的计数器是对象的一个属性(共享),我认为它可能会上升到10个以上,我是否遗漏了什么?冻结是由等待响应引起的,但这就是为什么要在后台线程上等待。一旦响应到达,冻结就完成了,因此主线程可以处理响应。你说得对,柜台可能不止10个。对不起,我不知道柜台是ivar。