Frage

Ich benutze eine Kombination aus globalen Vars und NSRunloop, um die Synchronisation während meiner gesamten Anwendung zu erzwingen. Obwohl es funktioniert, scheint es mir ein bisschen hässlich. Gibt es eine andere Möglichkeit, das gleiche Ergebnis zu erzielen?

Hier ist ein typisches Beispiel:

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];

In diesem Code muss ich warten, bis das Parkspots -Objekt vollständig initialisiert ist, bevor ich Updatelocation initialisiere. Da Updatelocation erwartet, dass Parkspots vollständig initialisiert werden, ohne dass die Runloop -Aktualisierung der Lokalisierung nicht ordnungsgemäß initialisiert wurde. Mit dem Runloop funktioniert alles wie erwartet.

Dies sieht für mich jedoch sehr hässlich aus (ein globales VAR an verschiedenen Stellen in meinem Code festgelegt). Gibt es eine elegantere Lösung? Vielen Dank im Voraus für Ihre Hilfe!

War es hilfreich?

Lösung

Sie können das Delegierte -Muster auf Ihrem verwenden ParkingSpots Klasse und rufen Sie den Delegierten an, wenn er initialisiert wird. z.B

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];
}

Sie können auch Benachrichtigungen verwenden, um dasselbe zu erreichen.

Andere Tipps

Ich denke, Sie müssen sich Objektiv-Cs ansehen Synchronisationsfunktion.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top