NSNotification阻止方法完全工作

时间:2010-12-01 14:33:48

标签: iphone objective-c cocoa-touch

我有这个方法:

- (void)reloadMessages:(NSNotification *)notification {
    NSLog(@"RECIEVED NEW MESSAGES TO MessagesRootViewController");

    // we need to get the threads from the database...
    NSFetchRequest *theReq = [[NSFetchRequest alloc] init];
    NSEntityDescription *entity = [NSEntityDescription entityForName:@"Thread" inManagedObjectContext:managedObjectContext];
    [theReq setEntity:entity];

    threads = [[managedObjectContext executeFetchRequest:theReq error:nil] retain];

    UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"New Message" message:@"New message" delegate:nil cancelButtonTitle:@"Thanks" otherButtonTitles:nil];
    [alert show];
    [alert release];

    [self.tableView reloadData];

}

如果我致电[self reloadMessages:nil],那么该功能完全符合上述规定。

如果从NSNotificationCenter通知中调用它:[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(reloadMessages:) name:@"newMessagesArrived" object:nil];然后它会转到[alert show]并停止,屏幕将根据此屏幕截图变暗:

alt text

知道为什么会这样吗?

如果我拿走UIAlertView位并离开[self.tableView reloadData];然后它会调用该函数,但它会在某个时刻停止。对表视图数据源方法的NSLogging显示表视图使用正确的行数进行更新(表明核心数据请求不会导致问题)但是cellForRowAtIndexPath未被调用。

程序没有崩溃。如果没有警报视图,表视图不会像上面那样完全重新加载,但视图仍然可用,并且移动表视图会导致行正确更新(如同去往联系人选项卡再返回一样)。

如果您需要更多信息,我可以给您。

感谢您的帮助。 :)

汤姆

1 个答案:

答案 0 :(得分:1)

从NSNotificationCenter调用方法时,该方法不在GUI线程上。您必须使用performSelectorOnMainThread

在GUI线程上执行AlertDialog show和TableView重新加载