我有这个方法:
- (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]
并停止,屏幕将根据此屏幕截图变暗:
知道为什么会这样吗?
如果我拿走UIAlertView位并离开[self.tableView reloadData];
然后它会调用该函数,但它会在某个时刻停止。对表视图数据源方法的NSLogging显示表视图使用正确的行数进行更新(表明核心数据请求不会导致问题)但是cellForRowAtIndexPath
未被调用。
程序没有崩溃。如果没有警报视图,表视图不会像上面那样完全重新加载,但视图仍然可用,并且移动表视图会导致行正确更新(如同去往联系人选项卡再返回一样)。
如果您需要更多信息,我可以给您。
感谢您的帮助。 :)
汤姆
答案 0 :(得分:1)
从NSNotificationCenter调用方法时,该方法不在GUI线程上。您必须使用performSelectorOnMainThread