multithreading - 在后台线程上实例化 UI 对象是否安全?

标签 multithreading cocoa-touch cocoa

我不清楚使用 UI 对象到什么程度是不安全的。我有一些代码刚刚移至另一个队列(使用 NSOperation 和 NSOperationQueue)。我正在审查需要清理不安全代码的地方并运行此:

alertNoDatabaseSelected = [[[UIAlertView alloc] 
    initWithTitle:NSLocalizedString(@"You Haven't Enabled Any Databases", nil) 
    message:[NSString stringWithFormat:NSLocalizedString(@"You can't search unless you choose at least one database in your settings.", nil), self.currentSearchEntity.keywords] 
    delegate:self cancelButtonTitle:NSLocalizedString(@"Settings", nil) 
    otherButtonTitles:nil] autorelease];
[alertNoDatabaseSelected show];

这两行在主线程之外都不安全吗?我确实有一些崩溃行为,这看起来是我应该考虑进行的第一种重构。

更新 这可能是一个更广泛的担忧。我有两个 NSManagedObjectContext,一个在主线程中,一个在另一个线程中。当我同步这些上下文时,可能会发生大量 UI 更新(特别是 TableView )。我想知道是否需要采取任何特殊措施来确保同步在主线程上自动启动所有这一切,或者我是否必须采取一些措施才能实现这种情况? (我可能需要就此写另一个问题。)

最佳答案

第二行在主线程之外肯定是不安全的。 alloc 本身在辅助线程上可能没问题,但我不知道 init... 方法是否可以,谨慎的假设是它不安全。

您应该在主线程上安排所有 UI 更新。如果您想将它们安排为 NSOperation 对象,可以使用 [NSOperationQueue mainQueue]

关于multithreading - 在后台线程上实例化 UI 对象是否安全?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9383580/

相关文章:

ios - 转移到另一个类时方法不起作用

iOS - viewDidUnload 奇怪的调用

macos - 如何在 Mac 应用程序中检索 Wi-Fi 热点列表?

xcode - 是否可以在 Xcode 的 "Localizable Strings"文件中本地化 NSMenuItem 的键盘快捷键?

java - 如何保持文件打开并在后台线程中向其追加数据?

c++ - C++中的多线程分子模拟

.net - Windows服务和线程编程.NET

Java - 如何从 GUI 安全地停止 Web 应用程序中的线程?

iphone - cocoa touch -- 测试对象是否是 objective-C 对象

objective-c - 如何在全屏 View 前显示 NSPanel?