警告:不应从辅助线程调用UIKit

时间:2010-07-08 08:19:08

标签: iphone multithreading

在我的iPhone应用程序中,我需要连接到Web服务器,因为这可能需要一些时间我使用这样的线程:

[NSThread detachNewThreadSelector:@selector(sendStuff) toTarget:self withObject:nil];

- (void)sendStuff {
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];

    //Need to get the string from the textField to send to server
    NSString *myString = self.textField.text;

    //Do some stuff here, connect to web server etc..

    [pool release];
}

在我使用self.textField的行上,我在控制台中收到一条警告: void _WebThreadLockFromAnyThread(bool),0x5d306b0:从主线程或Web线程以外的线程获取Web锁。不应该从辅助线程调用UIKit。

如何在不收到此错误的情况下使用textField?

5 个答案:

答案 0 :(得分:12)

这取决于你想用textField做什么。如果只读取值,您可以这样做:

[NSThread detachNewThreadSelector:@selector(sendStuff) toTarget:self withObject:self.textField.text];

- (void)sendStuff:(NSString*)myString {
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
    //Do someting with myString
    [pool release];
}

如果您想更改textField上的值,您可以:

[self.textField performSelectorOnMainThread:@selector(setText:) withObject:@"new Text"];

答案 1 :(得分:11)

执行在主线程上处理UI更新的任何选择器。您可以使用NSObject方法-performSelectorOnMainThread:withObject:waitUntilDone:

执行此操作

答案 2 :(得分:3)

为什么不:

[NSThread detachNewThreadSelector: @selector(sendStuff:) toTarget: self withObject: self.textField.text];

答案 3 :(得分:0)

这确实是不安全的行为。 MainThread是唯一应该连接UI的人。让你的线程返回一个字符串到mainthread,并有一个方法更新UI。例如,您可以通过将选择器传递给另一个线程方法来执行此操作,然后让另一个线程调用mainthread上的选择器。

答案 4 :(得分:0)

[self performSelectorOnMainThread:@selector(myMethod) withObject:nil waitUntilDone:NO]; 

将起作用