我从后台线程中的Web服务加载数据。当出现任何问题时在后台线程中显示UIAlertView
是否安全,或者我应该在主线程中显示警报视图?
感谢您的建议
谢
答案 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];