*** 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.}总结
以上是内存溢出为你收集整理的objective-c – iPhone使用异步URL请求的互斥体全部内容,希望文章能够帮你解决objective-c – iPhone使用异步URL请求的互斥体所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)