2014-01-29 3 views
0

В моем приложении я нажимаю локальные уведомления после того, как пользователь выполнит определенное действие.
Когда пользователь открывает приложение из нажатого уведомления, я хочу зарегистрировать событие в системе слежения (в моем случае это Mixpanel).
У меня должен быть ключ для регистрации события, которое я получаю с моего сервера.Выполните функцию только после завершения первой функции - ios

Так что я хочу сделать, это получить ключ в функции, и после завершения этой функции я хочу зарегистрировать событие.

Я попытался performSelectorOnMainThread:withObject:waitUntilDone:, но это не сработало

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 
{ 
    //some code here 
    [self performSelectorOnMainThread:@selector(performHandShake) 
          withObject:nil 
         waitUntilDone:YES]; 
    [self performSelectorOnMainThread:@selector(registerLaunchOptionsDetails:) 
          withObject:launchOptions 
         waitUntilDone:YES]; 
    //some code here 
} 

-(void)performHandShake 
{ 
    //myParams here 

    [[RKClient sharedClient] get:@"/handshake" usingBlock:^(RKRequest *request) { 
     request.params = [RKParams paramsWithDictionary:myParams]; 
     request.method = RKRequestMethodGET; 

     request.onDidLoadResponse = ^(RKResponse *response) { 
      //Set the tracking key here 
     }; 

     request.onDidFailLoadWithError = ^(NSError *error) { 
      NSLog(@"ERROR:%@",error); 
     }; 
    }]; 
} 

-(void)registerLaunchOptionsDetails:(NSDictionary *)launchOptions 
{ 
    UILocalNotification *localNotification = [launchOptions objectForKey: UIApplicationLaunchOptionsLocalNotificationKey]; 

    if (localNotification) { 
     //Register the event here using the key 
    } 
} 

Проблема заключается функция registerLaunchOptionsDetails выполняется перед performHandShake завершена, и события не регистрируются.

+1

Вы можете просто позвонить 'registerLaunchOptionsDetails' функцию в конце функции рукопожатия? –

+1

Вы должны использовать Grand Central Dispatch в этом случае. Использование очередей рекомендуется в этих ситуациях – Ali

+3

попытаться вызвать callregisterLaunchOptionsDetails из блока onDidLoadResponse? – alex

ответ

1

Это может быть излишним для того, что вы хотите сделать, но есть библиотека, подобная асинхронной для узла. Вы можете связать асинхронные задачи вместе и/или дождаться, пока несколько действий будут выполнены до выполнения другого действия.

ReactiveCocoa

1

При выполнении -[RKClient get:usingBlock], это создаст сетевую операцию, которая будет выполняться в фоновом режиме и метод будет возвращать.

Это очистит пробег до registerLaunchOptionsDetails, который будет происходить до завершения сетевой операции.

request.onDidLoad будет работать, когда операция сети будет завершена успешно, и у вас есть данные, которые были запрошены. Вот почему звонок registerLaunchOptionsDetails: там будет работать.

+0

Благодарим вас за разъяснение [RKClient get: usingBlock]. Я этого не знал. Это помогает мне в понимании вещей. – Sawsan

1

Блок request.onDidLoadResponse будет вызываться, когда вам нужно, поэтому вам необходимо позвонить registerLaunchOptionsDetails: из этого блока. Не забудьте передать launchOptions на этот блок через performHandShake и создать слабую ссылку на self, чтобы предотвратить ее сохранение в блоке. Окончательный код должен быть таким:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 
{ 
    //some code here 

    [self performSelectorOnMainThread:@selector(performHandShake:) withObject:launchOptions waitUntilDone:YES]; 


    //some code here 

} 

-(void)performHandShake:(NSDictionary *)launchOptions 
{ 
    //myParams here 

     [[RKClient sharedClient] get:@"/handshake" usingBlock:^(RKRequest *request){ 

     request.params = [RKParams paramsWithDictionary:myParams]; 
     request.method = RKRequestMethodGET; 

     __weak AppDelegate *weakSelf = self; 
     request.onDidLoadResponse = ^(RKResponse *response) 
     { 

      //Set the tracking key here 

      // Here is registerLaunchOptionsDetails: call 
      [weakSelf registerLaunchOptionsDetails:launchOptions]; 
     }; 

     request.onDidFailLoadWithError = ^(NSError *error) 
     { 
      NSLog(@"ERROR:%@",error); 
     }; 
    }]; 

} 

-(void)registerLaunchOptionsDetails:(NSDictionary *)launchOptions 
{ 

    UILocalNotification *localNotification = [launchOptions objectForKey: UIApplicationLaunchOptionsLocalNotificationKey]; 

    if (localNotification) 
    { 
     //Register the event here using the key 


    } 
} 
Смежные вопросы