从A级到B级的NSNotification延迟

时间:2014-06-30 13:57:36

标签: ios objective-c nsnotificationcenter event-listener nsnotification

我的NSNotification延迟了。

在myVC中,我有两个按钮,buttonA和buttonB。每个都链接到各自的pdf,pdfA和pdfB。按下按钮,按下A或B后按下按钮。 Push将用户带到RVC,其中有一个UIWebView。

我想要它,以便通过按A或B,UIWebView将显示相应的pdf文件。为了调试它,我将其设置为不使用更改pdf,而是使用NSLog显示文本。但是,在通过按下其他按钮从RVC返回myVC之后,它才能工作。

在myVC.m文件中

- (IBAction)open_pictures_A:(id)sender
{

    //do some button alert popup action/whatever button does


    RootViewController *dataObject = [RootViewController new];

    NSDictionary *userInfo = [NSDictionary dictionaryWithObject:dataObject
                                                         forKey:@"buttonA"];

    [[NSNotificationCenter defaultCenter] postNotificationName:@"MyNotification"
                                                        object:nil
                                                      userInfo:userInfo];



}

还有一个类似于buttonB,但forKey将是" buttonB"

在myVC.m的viewDidLoad中

我有

[[NSNotificationCenter defaultCenter] postNotificationName:@"MyNotification"
                                                        object:nil];

在我的RVC中,

RVC.h我有

@property (nonatomic, strong) NSString *property1;

在RVC.m我有

- (void)viewDidLoad
{

    // other stuff

[[NSNotificationCenter defaultCenter] addObserver:self
                                             selector:@selector(eventListenerDidReceiveNotification:)
                                                 name:@"MyNotification"

                                               object:nil];
 }




- (void)eventListenerDidReceiveNotification:(NSNotification *)notif
{
    if ([[notif name] isEqualToString:@"MyNotification"])
    {
        NSLog(@"Successfully received the notification from buttonB!");

        NSDictionary *userInfo = notif.userInfo;
        RootViewController *dataObject = [userInfo objectForKey:@"buttonB"];

        // Your response to the notification should be placed here
        NSLog(@"dataObject.property1 -> %@", dataObject.property1);

    }
}

但是,当我按下一个按钮退出RVC回到myVC时,日志条目才会显示

这是我用来从mVC到RVC的代码

-(IBAction)goToRVC{

    UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil];
    RootViewController *RVC = [storyboard instantiateViewControllerWithIdentifier:@"Root"];
    [UIApplication sharedApplication].delegate.window.RootViewController = RVC;

    }

然后从RVC到myVC

-(IBAction)backtomyVC{


     [[[UIApplication sharedApplication] delegate] performSelector:@selector(myVC)];
    [self disconnect];

}

为什么我的通知操作会被延迟?

1 个答案:

答案 0 :(得分:0)

这不是因为延迟。 当您按下按钮A或B时,您创建了新的RVC对象并发布了通知,但是您不会出现/推送RVC视图控制器(您只是初始化它),因此RVC没有触发viewDidLoad方法并且它并没有将自己注册为观察者。

之后,调用goToRVC方法创建RVC对象,然后将其添加到视图层次结构中,以便调用viewDidLoad方法,并将对象注册为观察者。

当您返回mVC时,RVC尚未解除分配,因此它会收到通知,您可以看到日志。

希望它清楚。