2015-01-29 2 views
1

Прямо сейчас я использую NSNotificationCenter для отправки синхронных уведомлений из моего одноадресного сокета в контроллер представления. Однако это вызывает проблемы. В viewDidAppear мои наблюдатели не получают уведомления, когда они должны. Как я могу сделать это асинхронно? Мне удалось заставить VC заполнить данные из моего сокета, отправив уведомление в свой viewDidLoad моего VC, но этот dosnt кажется правильным.ios, как отправить асинхронное уведомление отдельному VC?

Как работает мое приложение, я передаю данные в сокет, а сокет дает вызов «initialize», после этого уведомления я нажимаю на новый VC. Может ли это вызвать проблему?

-(void)receiveInitializeNotification:(NSNotification *)notificaiton 
{ 
    dispatch_async(dispatch_get_main_queue(), ^{ 
     [self performSegueWithIdentifier:@"toSetListRoomVC" sender:self]; 
    }); 
} 

Текущий КОД: Socket

- (void)startSocketWithHost:(NSString *)host;{ 

    [SIOSocket socketWithHost:host response:^(SIOSocket *socket) { 

     self.socket = socket; 


     //Send a message to RoomCode controler to notify the reciever that the user has enetered a correct code and can enter the specific setList room. 
     [self.socket on:@"initialize" callback:^(NSArray *args) { 

      NSDictionary *socketIdDict = [args objectAtIndex:0]; 
      NSString *socketID = [socketIdDict objectForKey:@"socket"]; 
      self.socketID = socketID; 
      [[NSNotificationCenter defaultCenter] postNotificationName:@"initialize" object:nil]; 

     }]; 

     //on Callback for events related to updates with the song queue. 
     [self.socket on:@"q_update_B" callback:^(NSArray *args) { 

      NSLog(@"qUpdateB has been emitted"); 
      NSArray *tracks = [args objectAtIndex:0]; 
      self.setListTracks = tracks; 

      [self performSelectorOnMainThread:@selector(postQUpdateBNotification) withObject:nil waitUntilDone:YES] ; 
     }]; 

     [self.socket on:@"current_artist_B" callback:^(NSArray *args) { 

      self.currentArtist = [args objectAtIndex:0]; 

      [self performSelectorOnMainThread:@selector(postCurrentArtistBNotification) withObject:nil waitUntilDone:YES] ; 

     }]; 

Получение уведомления "инициализации".

-(void)receiveInitializeNotification:(NSNotification *)notificaiton 
{ 
     [self performSegueWithIdentifier:@"toSetListRoomVC" sender:self]; 
} 

Прием qUpdateB в SetListVC

- (void)receiveUpdateBNotification:(NSNotification *)notification 
{ 
    NSLog(@"Recieved update B"); 
    NSArray *recievedtracks = [[SocketKeeperSingleton sharedInstance]setListTracks]; 
    self.tracks = recievedtracks; 
    [self.tableView reloadData]; 

} 

Мой "qUpdateB был emmited" получает призвал Segue к новым ВК. Однако уведомление не получено в новом VC. Если добавить

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

К моему SetlistVC вместе с наблюдателем, то он будет работать, как задумано, но это dosnt кажется правильным.

+1

Я очень сомневаюсь, что вам действительно нужен метод async, но вы посмотрели на метод 'dispatch_async'? –

+0

Я обновил свой вопрос более подробно, возможно, вы правы. Возможно, это связано с тем, как я нажимаю на новый VC, который вызывает проблемы. Мысли? @ CanPoyrazoğlu – Andy

+0

Вы должны убедиться, что ваш контроллер просмотра зарегистрировал уведомление перед публикацией «initialize». – KudoCC

ответ

1

Сокет работает над сетевой нитью, не так ли? Если вы публикуете уведомление в этом потоке, получатель получит уведомление в сетевом потоке. Однако вы можете использовать только пользовательский интерфейс на основном потоке. Таким образом, вам действительно нужно опубликовать уведомление по основному потоку, таким образом, ваш контроллер просмотра может получать уведомление по основному потоку.

[self performSelectorOnMainThread:@selector(postNotification) withObject:nil waitUntilDone:YES] ; 

- (void)postNotification { 
    [[NSNotificationCenter defaultCenter] postNotificationName:@"yourEventName" object:self] ; 
} 
+0

Я тебя так сильно люблю – Andy

+0

На самом деле, сейчас он работает, но есть отсрочка 5-10 секунд. – Andy

+0

теперь это 2-3-секундная задержка. хм, возможно, это проблема на стороне сервера. Но это был определенно ответ. Спасибо. – Andy

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