我想知道为什么我无法在辅助线程中运行按钮操作(参见下面的辅助线程代码),当我这样做时,APP崩溃并向我显示以下错误消息。
NSThread *thread = [[NSThread alloc]initWithTarget:self selector:@selector(insertdata) object:nil];
[thread start];
void _WebThreadLockFromAnyThread(bool), 0x6a8cfe0: Obtaining the web lock from a thread other than the main thread or the web thread. UIKit should not be called from a secondary thread.
bool _WebTryThreadLock(bool), 0x6a8cfe0: Tried to obtain the web lock from a thread other than the main thread or the web thread. This may be a result of calling to UIKit from a secondary thread. Crashing now...
1 WebThreadLock
2 -[UIFieldEditor setText:andSetCaretSelectionAfterText:]
3 -[UITextField setText:]
4 -[XYZ reset]
5 -[XYZ insertdata]
6 -[NSThread main]
7 __NSThread__main__
8 _pthread_start
9 thread_start
但是当我将线程更改为主线程时(参见下面的主线程代码)我没有看到任何崩溃,我的APP运行完美。任何人都可以解释有什么区别,为什么我不能运行动作辅助线程。
[self performSelectorOnMainThread:@selector(insertdata) withObject:nil waitUntilDone:NO];
感谢。
答案 0 :(得分:1)
错误消息告诉您确切原因:
从主线程或其他线程以外的线程获取Web锁定 网络线程。不应该从辅助线程调用UIKit。
如果操作不花费很长时间,那么在后台线程上执行它是没有意义的。如果操作 需要很长时间,您应该将数据检索(或任何需要的时间)与UI更新分开,在后台运行数据检索,然后返回主线程进行更新用户界面。最好使用GCD:
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_NORMAL, 0), ^{
[self downloadData]; // takes long
dispatch_async(dispatch_get_main_queue(), ^{
[self updateUI]; // here you can safely call UIKit
});
});