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

时间:2012-02-21 19:08:26

标签: 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];

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

UPDATE 这可能是一个更广泛的问题。我有两个NSManagedObjectContexts,一个在主线程中,另一个在另一个线程中。当我同步这些上下文时,可能会发生很多UI更新(特别是表视图)。我想知道我是否需要采取任何特殊措施来确保同步在主线程上自动解决所有这些问题,或者我是否必须做一些事情来实现它? (我可能需要再写一个问题。)

1 个答案:

答案 0 :(得分:1)

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

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