Uso de cacau para iPhone de nsrunloop
-
19-09-2019 - |
Pergunta
Encontro -me usando uma combinação de vars globais e nsrunloop para forçar a sincronização por toda a minha aplicação. Embora funcione, parece um pouco feio para mim. Existe alguma outra maneira de alcançar o mesmo resultado?
Aqui está um exemplo normalmente:
ParkingSpots *parkingSpots = [[[ParkingSpots alloc] initWithMapViewController:self] autorelease];
keepRunning = YES;
NSRunLoop *theRL = [NSRunLoop currentRunLoop];
while (keepRunning && [theRL runMode:NSDefaultRunLoopMode beforeDate:[NSDate distantFuture]]);
UpdateLocation *updatedLocation = [[[UpdateLocation alloc] initWithUserid:@"me" andCoordinate:annotation.coordinate withMapViewController:self]
autorelease];
NSLog(@"Lat = %f, Long = %f",annotation.coordinate.latitude,annotation.coordinate.longitude);
[updatedLocation sendUpdate];
Neste código, preciso esperar até que o objeto de estacionamentos seja completamente inicializado antes de inicializar a atualização. Como o UpdatElocation espera que os estacionamentos sejam totalmente inicializados, sem que o Runloop o atualizado não estivesse inicializando corretamente. Com o Runloop, tudo funciona conforme o esperado.
No entanto, isso parece muito feio para mim (definindo um VAR global em vários pontos do meu código). Existe uma solução mais elegante? Agradeço antecipadamente por sua ajuda!
Solução
Você pode usar o padrão de delegado em seu ParkingSpots
aula e ligue para o delegado quando terminar de inicializar. por exemplo
ParkingSpots *parkingSpots = [[[ParkingSpots alloc] initWithMapViewController:self] autorelease];
parkingSpots.delegate = self;
parkingSpots.didInitialiseSelector = @selector(parkingSpotsInitialised:);
[parkingSpots startLengthyInitialisation];
- (void) parkingSpotsInitialised:(ParkingSpots*)parkingSpots {
UpdateLocation *updatedLocation = [[[UpdateLocation alloc] initWithUserid:@"me" andCoordinate:annotation.coordinate withMapViewController:self] autorelease];
}
Você também pode usar notificações para alcançar a mesma coisa.
Outras dicas
Eu acho que você precisa olhar para o Objective-C's recurso de sincronização.