代码之家  ›  专栏  ›  技术社区  ›  vodkhang

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

  •  0
  • vodkhang  · 技术社区  · 14 年前

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

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

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

    下面是我的示例代码:

    模型管理器

    - (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;
    }
    

    我想问一下,是否存在同时调用helperdifinishingMyitems方法的情况。这意味着,例如,facebook返回10个项目,twitter返回10个项目,count的输出将永远大于10吗?

    如果只有一个线程,那么线程如何完成对1个响应的解析并跳转到另一个响应,因为IMO,线程只能连续执行,一块一块地执行代码

    1 回复  |  直到 14 年前
        1
  •  1
  •   Tom Dalling    14 年前

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

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

    将响应放回到主线程上可以避免大量的多线程问题。

    而且,计数的输出永远不会大于10。只是多个线程可能正在运行 helperDidFinishGettingMyItems: 同时。它们不会自动组合这两个数组。

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