在后台线程中显示UIAlertView

时间:2011-02-28 10:13:31

标签: iphone objective-c

我从后台线程中的Web服务加载数据。当出现任何问题时在后台线程中显示UIAlertView是否安全,或者我应该在主线程中显示警报视图?

感谢您的建议

3 个答案:

答案 0 :(得分:49)

除主线程外,不要对GUI执行任何操作。它可能会导致非常奇怪的问题和/或您不想处理的崩溃。通常回溯也是非常无益的,所以默认情况下尽量避免这种问题。

因此请使用:

[self performSelectorOnMainThread:@selector(showAlert:) withObject:alertString waitUntilDone:NO];

如果您正在使用Grand Central发送,您可以执行以下操作:

dispatch_async(dispatch_get_main_queue(), ^{ /* show alert view */ });

<强>更新

Swift(3.0 +):

DispatchQueue.main.async { // code }

对于你收到的Notifications这样做有时很有帮助,我有一些实例,他们是从不同的线程中解雇的。

更新2:

看起来苹果已经在iOS11 / Xcode9中添加了一些新工具,以帮助调试在错误的线程上调用内容的问题。

答案 1 :(得分:5)

dispatch_async(dispatch_get_main_queue(), ^{
            UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Title" message:@"Message" delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil];
            [alert show];
        });

此代码适合我

答案 2 :(得分:4)

您可以尝试通过以下方式在主线程上显示警报:

UIAlertView *alert = [
    [[UIAlertView alloc] initWithTitle:@"the title"
                               message:@"the message"
                              delegate:self
                     cancelButtonTitle:@"OK"
                     otherButtonTitles: nil] autorelease];
[alert performSelector:@selector(show)
              onThread:[NSThread mainThread]
            withObject:nil
         waitUntilDone:NO];
[alert release];