Прямо сейчас я использую 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 кажется правильным.
Я очень сомневаюсь, что вам действительно нужен метод async, но вы посмотрели на метод 'dispatch_async'? –
Я обновил свой вопрос более подробно, возможно, вы правы. Возможно, это связано с тем, как я нажимаю на новый VC, который вызывает проблемы. Мысли? @ CanPoyrazoğlu – Andy
Вы должны убедиться, что ваш контроллер просмотра зарегистрировал уведомление перед публикацией «initialize». – KudoCC