2012-02-21 126 views
2

我不清楚使用UI对象的程度不安全。我有一些代码,我刚刚移动到另一个队列(使用NSOperation和NSOperationQueue)。我检讨,我需要清理非安全的代码,跑翻过这一点:在后台线程上实例化UI对象是否安全?

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

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

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

+1

我想我会使用dispatch_async(dispatch_get_main_queue(),^ {...})来照顾这些块。 – Jim 2012-02-21 20:08:09

相关问题