objective-c – iPhone使用异步URL请求的互斥体

我的iPhone客户端对异步请求有很大的参与,很多时候一直在修改静态字典或数组集合。因此,通常看到较大的数据结构需要较长时间才能从服务器检索出以下错误:

*** Terminating app due to uncaught exception 'NSGenericException', reason: '*** Collection <NSCFArray: 0x3777c0> was mutated while being enumerated.'

这通常意味着向服务器发出的两个请求返回尝试修改同一集合的数据。我正在寻找的是一个教程/示例/理解如何正确构造我的代码,以避免这种有害的错误。我确实相信正确答案是互斥的,但我从来没有亲自使用过它们。

这是使用NSURLConnection进行异步HTTP请求的结果,然后在请求完成后,使用NSNotification Center作为委托方式。当触发相同集合集的请求时,我们会得到这些冲突。

如果有可能同时从两个线程访问任何数据(包括类),您必须采取措施保持这些同步。

幸运的是Objective-C使用synchronized关键字很容易做到这一点。这个关键字作为任何Objective-C对象的参数。在同步部分中指定相同对象的任何其他线程将停止,直到第一个完成。

-(void) doSomethingWith:(NSArray*)someArray
 {    
    // the synchronized keyword prevents two threads ever using the same variable
    @synchronized(someArray)
    {
       // modify array
    }
 }

如果您需要保护的不仅仅是一个变量,您应该考虑使用一个表示访问该数据集的信号量。

// Get the semaphore.
id groupSemaphore = [Group semaphore];

@synchronized(groupSemaphore) 
{
    // Critical group code.
}
翻译自:https://stackoverflow.com/questions/554270/iphone-use-of-mutexes-with-asynchronous-url-requests

转载注明原文:objective-c – iPhone使用异步URL请求的互斥体