主队列上的iOS线程冲突

时间:2013-12-24 20:48:34

标签: ios multithreading grand-central-dispatch

我有insertItemsAtIndexPath方法进入单元格,当我尝试访问我的AVFoundation控制器类时,我有一半时间崩溃。我感觉它是主线程上的线程冲突,并试图使用逻辑来帮助,但这并没有解决问题。

我一直在阅读互斥和信号量,我想知道你的建议是如何处理上述过程的。基本上,我试图让[self presentViewController:myAVFoundationController]不要与包含dispatch_asyn(dispatch_get_main_queue, ^{ [_collectionView insertItemAtIndexPath:@[indexPath]] };

的for循环发生冲突

我现在正在寻找@synchronized(),但似乎有很多选项通过the documentation I am looking at。其中包括:NSOperation / Queue,互斥,信号量等,以及如何在主队列上实现线程安全。

2 个答案:

答案 0 :(得分:1)

只要与您的UI相关的任何内容都存在线程问题,并且写入与您的UI相关的任何值的任何内容都包含在dispafch_async(dispatch_get_main_queue(), ...);

通过在调试器中添加“所有异常”断点来暂停执行,然后查看所有线程的堆栈跟踪。

如果主线程是唯一做任何事情的线程,那么您就没有线程问题。只有主线程可以触及与用户界面相关的任何内容,并且应该在那里设置主线程上所需的任何属性。最后,不要在线程之间共享可变对象。在将I提供给另一个帖子之前,复制它(默认情况下副本是不可变的)。

答案 1 :(得分:0)

我找到了@synchronized的运气,例如以下内容:

@synchronized([NSOperationQueue mainQueue]) { 
    [self uiUpdate]; 
    }