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

时间:2010-05-11 02:11:56

标签: iphone objective-c multithreading asynchronous

我正在使用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,线程只是后续执行,代码块按代码块

1 个答案:

答案 0 :(得分:1)

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

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

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

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

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