不应从辅助线程调用UIKit的错误消息

hmt*_*hur 1 multithreading cocoa-touch objective-c uikit

我有一个应用程序,它使用a UISearchBar根据用户输入从外部API动态搜索.

该应用正在搜索外部API并正确显示结果,但是当我从搜索结果中选择任何行时,屏幕会冻结,我收到此错误;

尝试从主线程或Web线程以外的线程获取Web锁定不应从辅助线程调用UIKit

我完全不知道如何解决这个问题.

这是代码;

- (void) run: (id) param  {
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];

    NSXMLParser *parser = [[NSXMLParser alloc] initWithContentsOfURL: [self URL]];
    [parser setDelegate: self];
    [parser parse];
    [parser release];
    [delegate parseDidComplete];
    [pool release];
} 

- (void) parseXMLFile: (NSURL *) url
{ 
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
    [self setURL: url];
    NSThread* myThread = [[NSThread alloc] initWithTarget:self
                                                 selector:@selector(run
   object: nil];
    [myThread start];
    [pool release];
}
Run Code Online (Sandbox Code Playgroud)

bbu*_*bum 10

"尝试从主线程以外的线程获取Web锁定,或者不应该从辅助线程调用UIKit"

修复在概念上很简单; 不要从您的线程更新UI.

假设parseDidComplete消息来源于此,那么这样的东西将"起作用":

[delegate performSelectorOnMainThread: @selector(parseDidComplete) withObject: nil waitUntilDone: YES];
Run Code Online (Sandbox Code Playgroud)

"工作"因为线程很难,这个答案完全忽略了你可能遇到的任何同步问题.

请注意,您最好使用NSOperationNSOperationQueue.它们有很好的文档,并且有很多例子.