Frage

Ich versuche, ein (nicht-gleichzeitige) NSOperation für Standortaktualisierungen mit dem iPhone SDK zu implementieren. Das „Fleisch“ der NSOperation Unterklasse geht in etwa so:

- (void)start {
    // background thread set up by the NSOperationQueue
    assert(![NSThread isMainThread]);

    if ([self isCancelled]) {
        return;
    }

    self->locationManager = [[CLLocationManager alloc] init];
    locationManager.delegate = self;
    locationManager.desiredAccuracy = self->desiredAccuracy;
    locationManager.distanceFilter = self->filter;
    [locationManager startUpdatingLocation];

    [self willChangeValueForKey:@"isExecuting"];
    self->acquiringLocation = YES;
    [self didChangeValueForKey:@"isExecuting"];
}

- (void)cancel {
    if ( ! self->cancelled ) {
        [self willChangeValueForKey:@"isCancelled"];
        self->cancelled = YES;
        [self didChangeValueForKey:@"isCancelled"];

        [self stopUpdatingLocation];
    }
}

- (BOOL)isExecuting {
    return self->acquiringLocation == YES;
}

- (BOOL)isConcurrent {
    return NO;
}

- (BOOL)isFinished {
    return self->acquiringLocation == NO;
}

- (BOOL)isCancelled {
    return self->cancelled;
}



- (void)stopUpdatingLocation {
    if (self->acquiringLocation) {
        [locationManager stopUpdatingLocation];

        [self willChangeValueForKey:@"isExecuting"];
        [self willChangeValueForKey:@"isFinished"];
        self->acquiringLocation = NO;  
        [self didChangeValueForKey:@"isExecuting"];
        [self didChangeValueForKey:@"isFinished"];
    }
    locationManager.delegate = nil;
}


- (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation {
    assert(![NSThread isMainThread]);

    // ... I omitted the rest of the code from this post

    [self stopUpdatingLocation];
}

- (void)locationManager:(CLLocationManager *)manager didFailWithError:(NSError *)theError {
    assert(![NSThread isMainThread]);
    // ... I omitted the rest of the code from this post
}

Nun, auf dem Haupt-Thread erstelle ich eine Instanz dieser Operation und fügen Sie sich einen NSOperationQueue. Die Start-Methode wird jedoch keine der -locationManager:... Delegatmethoden aufgerufen genannt. Ich verstehe es nicht, warum sie nie aufgerufen.

Ich habe die Schnittstelle sich an die <CLLocationManagerDelegate> Protokoll machen. Ich lasse die NSOperationQueue den Faden für diesen Vorgang verwalten, so dass es alle auf die CLLocationManagerDelegate Dokumentation wird konform sollte:

  

Die Methoden des Delegatobjekt aus dem Thread aufgerufen, in dem Sie die entsprechenden Standort-Dienste gestartet. Das Gewinde muss selbst eine aktive Laufschleife, wie die in Ihrer Anwendung Haupt-Thread gefunden.

Ich bin nicht sicher, was sonst noch für diese Arbeit zu versuchen. es starrt mich vielleicht ins Gesicht ... Jede Hilfe ist willkommen.

Vielen Dank im Voraus!

War es hilfreich?

Lösung

Sie fehlen die „aktive Laufschleife“ -Teil. Am Ende der Start Methode add:

while (![self isCancelled])
  [[NSRunLoop currentRunLoop] runUntilDate:someDate];

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