【问题标题】:Asynchronous callback for network in Objective-C IphoneObjective-C Iphone中网络的异步回调
【发布时间】:2010-05-11 02:11:55
【问题描述】:

我正在处理网络请求 - Objective-C 中的响应。异步模型有些东西我不明白。

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

我在这里不明白的是:当来自社交网络的响应回来时,有多少线程将处理响应。根据我对多线程和网络(在 Java 中)的理解,必须有 2 个线程处理 2 个响应,并且这 2 个线程将执行代码以将响应添加到数组中。那么,它可能有竞争条件并且程序可能会出错,对吗?它是 iphone Objective-C 的正确工作模型吗?或者他们以不同的方式做到这一点,它永远不会有竞争条件,我们不必关心锁定、同步?

这是我的示例代码:

模型管理器.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的情况。这意味着,例如,facebook 返回 10 个项目,twitter 返回 10 个项目,count 的输出是否会大于 10?

如果只有一个线程,线程如何完成解析 1 个响应并跳转到另一个响应,因为,IMO,线程只是按顺序执行,逐个代码块

【问题讨论】:

    标签: iphone objective-c multithreading asynchronous


    【解决方案1】:

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

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

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

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

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

    【讨论】:

    • 如果我们把它放回主线程,它会冻结我们的屏幕吗? “只是多个线程可能同时运行 helperDidFinishGettingMyItems:。它们不会自动合并两个数组。”我不明白这一点。如果两个线程同时运行该方法并同时运行for循环,并且我的计数器是对象的一个​​属性(它是共享的),我认为它可以上升到10多个,我我错过了什么?
    • 冻结是由于等待响应引起的,但这就是您在后台线程上等待的原因。一旦响应到达,冻结就完成了,因此主线程可以处理响应。你是对的,计数器可能超过 10 个。抱歉,我没有意识到计数器是 ivar。
    猜你喜欢
    • 2011-05-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-16
    相关资源
    最近更新 更多