2013-02-13 69 views
0

我有一个奇怪的问题。在ViewController.m,我成功保存后发布通知,并执行塞格到ListViewController。在ListViewController.m,我设立了观察员在viewDidLoad并且申报处理的方法。即使正确调用方法,NSNotification处理程序方法内部也没有执行任何代码

问题是处理程序方法被调用,但没有执行代码!任何想法为什么?

// ViewController.m 
if (success) { 
    [[NSNotificationCenter defaultCenter] postNotificationName:kAHPlistSavedSuccessfully object:self]; 
    [self performSegueWithIdentifier:kAHDetailToListSegue sender:self]; 
} 

// ListViewController.m 
- (void)viewDidLoad 
{ 
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(plistSavedSuccessfully:) name:kAHPlistSavedSuccessfully object:nil]; 
} 

- (void)plistSavedSuccessfully:(NSNotification *)notification 
{ 
    NSLog(@"notification %@", notification); 
    [self someMethod]; // not called ! 
} 
+0

这是来自plistSavedSuccessfully的日志消息:notif = NSConcreteNotification 0x1f5406f0 {name = plistSavedSuccessfully; object = } – alexhajdu 2013-02-13 23:43:07

+0

如果是打印NSLog,它也应该执行'someMethod'。 someMethod内部是什么?你有没有尝试在其中添加NSLog并检查? – iDev 2013-02-13 23:44:06

+0

@ACB是的,NSLog中someMethod的作品,但如果我尝试修改ListViewControllers插座它不起作用 – alexhajdu 2013-02-13 23:54:04

回答

1

我可以发现一些可能有错的东西。

首先,在向列表视图控制器执行segue之前发布通知,因此可能在列表视图控制器将其自身添加为通知的观察者之前发布通知。 (不太可能,因为日志语句正在打印,但在某些情况下仍然可能)。

第二件事是通知是在与发布通知相同的队列上收到的。是否有可能在不同的队列上向主队列调用了发布通知代码?如果someMethod对不是线程安全的代码执行任何操作,这可能会导致问题。您应该验证您的发布通知代码被调用的是哪个队列,并且要么确保在主队列中或在您的处理程序中调用该队列,请使用dispatch_async将调用someMethod调度到主队列。

+0

是的,问题是为了 - 在继续之前通知。谢谢Jasarien! – alexhajdu 2013-02-13 23:55:12

+0

问题仍然存在......我的notif被调用了两次,并且没有用户界面更新正在唤醒:/ – alexhajdu 2013-02-14 10:25:53

相关问题