NSNotification не вызывает селектор - PullRequest
0 голосов
/ 31 января 2012

Я создаю NSNotification в appDelegate .

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(checkRegister:) name:@"checkRegister" object:nil];

    return YES;
}

-(void)checkRegister:(NSNotification *) notification{

//Some code

} 

И я отправляю уведомление в каком-то другом классе:

-(void)connectionDidFinishLoading:(NSURLConnection *)connection
{
    NSLog(@"DONE. Received Bytes: %d", [webData length]);
    NSString *theXML = [[NSString alloc] initWithBytes: [webData mutableBytes] length:[webData length] encoding:NSUTF8StringEncoding];
    NSLog(@"%@",theXML);
    [theXML release];

    NSXMLParser *xmlParser = [[NSXMLParser alloc] initWithData: webData];
    [xmlParser setDelegate:self];
    [xmlParser setShouldResolveExternalEntities: YES];
    [xmlParser parse];
    [xmlParser release];

    [connection release];
    [webData release];

    if(strUserName != NULL)
        [[NSNotificationCenter defaultCenter] postNotificationName:@"checkRegister" object:nil];


}

Проблема в том, что checkRegister никогда не вызывается.

1 Ответ

2 голосов
/ 31 января 2012

Какова цель вашего @"checkRegister" уведомления, у вас есть if(strUserName != NULL), проверьте, если вы, прежде чем публиковать уведомление, но я не вижу, где вы можете настроить strUserName так определенно, попробуйте NSLog(@"%@", strUserName),Я уверен, что это ноль.если это strUserName взято из данных XML, которые вы анализируете, вы должны опубликовать уведомление после кода синтаксического анализа XML, что будет в ваших NSXMLParser методах делегирования, которые вы реализуете.Который будет одним из них, который вы используете.

[xmlParser parse] не блокируется, поэтому ваш

if(strUserName != NULL)
    [[NSNotificationCenter defaultCenter] postNotificationName:@"checkRegister" object:nil];

будет вызван до того, как xmlParser закончит анализИтак, ваше strUserName еще не установлено, и это причина того, что он равен нулю, и ваш postNoticationName: не будет называться

РЕДАКТИРОВАТЬ:

положить ваш

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(checkRegister:) name:@"checkRegister" object:nil];

в самом верху вашего application:didFinishLaunchingWithOptions: весьма вероятно, что вы разместите уведомление на главном экране до того, как зарегистрируетесь для уведомления, например,

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(checkRegister:) name:@"checkRegister" object:nil];
    self.window = [[[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]] autorelease];
    // Override point for customization after application launch.
    if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPhone) {
        self.mainViewController = [[[MainViewController alloc] initWithNibName:@"MainViewController_iPhone" bundle:nil] autorelease];
    } else {
        self.mainViewController = [[[MainViewController alloc] initWithNibName:@"MainViewController_iPad" bundle:nil] autorelease];
    }
    self.window.rootViewController = self.mainViewController;
    [self.window makeKeyAndVisible];
    return YES;
}

будет работать, а

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    self.window = [[[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]] autorelease];
    // Override point for customization after application launch.
    if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPhone) {
        self.mainViewController = [[[MainViewController alloc] initWithNibName:@"MainViewController_iPhone" bundle:nil] autorelease];
    } else {
        self.mainViewController = [[[MainViewController alloc] initWithNibName:@"MainViewController_iPad" bundle:nil] autorelease];
    }
    self.window.rootViewController = self.mainViewController;
    [self.window makeKeyAndVisible];
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(checkRegister:) name:@"checkRegister" object:nil];
    return YES;
}

не будет работать, если загрузка данных выполняется методом MainControllerView viewDidLoad.

...