我在异步(串行)工作队列中有一个长时间运行的函数。 我知道有时这个函数会在特定的openCV调用中挂起。 由于某种原因,这个挂起也导致主线程挂起。 暂停并进入调试模式时,我看到有一个对
的调用semaphore_wait_trap()
在主线程(队列)
上我可以在调试模式下挂起挂起的线程(我的工作队列),然后这个陷阱消失,GUI再次在手机上响应。
在取消暂停工作线程后,GUI响应1-2秒(我怀疑再次激活此线程)然后UI再次无响应。
此线程不对主线程/队列
进行dispatch_sync()
调用
IOS是否可能暂停主线程(“陷阱”),因为工作人员长时间运行?
我可以强制它删除块??
我正在添加调试模式堆栈的一些打印屏幕。
在暂停挂起队列之前:
挂线:
暂停和暂停坏队列后:
答案 0 :(得分:2)
IOS是否可能暂停主线程(“陷阱”),因为工作人员长时间运行? - 没有。 我认为,您的问题与绘制或更改某些UI元素有关。并非所有函数都可以从后台线程调用(例如,必须在主线程中完成对UI元素的更改)。在串行队列中,如果任何方法需要更改UI元素,则必须在主线程上调用它,例如
dispatch_async(dispatch_get_main_queue(), ^{
//do some main thread job here
});
)
答案 1 :(得分:0)
也许你只是忘了将一个变量保留到dispatch函数调用中(对于我来说,我在dispatch_once_t声明之前省略了一个静态关键字,并且dispatch无法使用内联函数进行处理)。堆栈跟踪就像你的一样。那是我的错。
+ (instancetype)sharedInstance
{
(static was omitted) dispatch_once_t once;
static id sharedInstance;
dispatch_once(&once, ^{
sharedInstance = [[self alloc] init];
});
return sharedInstance;
}