在辅助线程中执行按钮操作

时间:2011-11-25 06:49:07

标签: objective-c uibutton ios5 nsthread

我想知道为什么我无法在辅助线程中运行按钮操作(参见下面的辅助线程代码),当我这样做时,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];

感谢。

1 个答案:

答案 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
    });
});