2010-05-11 23 views
0

我正在使用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吗?

如果只有一个单一的线程,如何可以在线程完成通过的代码

回答

1

是块解析1个响应和因为,IMO,线程仅sequently执行跳转到其它反应中,代码块,每个网络请求可能有一个线程。诀窍是处理主线程上的响应。你应该有这样的东西:

- (void)helper:(id <NCHelper>)helper didReturnItems:(NSArray *)items; 
{ 
    [self performSelectorOnMainThread:@selector(helperDidFinishGettingMyItems:) 
          withObject:items 
         waitUntilDone:NO]; 
} 

把响应放回主线程将避免一堆多线程问题。

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

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

+0

如果我们把它放回主线程,它会冻结我们的屏幕? “只是多个线程可能同时运行helperDidFinishGettingMyItems:它们不会自动组合这两个数组。” 我不明白这一点。如果两个线程同时运行该方法并同时运行for循环,并且我的计数器是对象的属性(它是共享的),我认为它可以高达10以上我错过了什么? – vodkhang 2010-05-11 03:33:24

+0

冻结是由等待响应引起的,但这就是您在后台线程中等待的原因。一旦响应到达,冻结完成,所以主线程可以处理响应。你是对的,柜台可能超过10个。对不起,我没有意识到柜台是伊娃。 – 2010-05-11 05:05:22