Frage

Ich habe Probleme, einen Performselektor -AfterDelay -Befehl zu feuern, bei Erkennung eines Beschleunigungsmessers "Flick". Die Bewegung wird erkannt ('Gothere' ist protokolliert), aber aus irgendeinem Grund wird der Selektor an den Befehl Performselector weitergeleitet.

Ich habe einen Testblock eingerichtet und einen Performselektor erfolgreich davon ausgeführt, daher denke ich nicht, dass Blöcke selbst das Problem verursachen. (Ich muss zugeben, dass ich auf Blöcken/Threads/Kriechen etwas dunstig ist)

Alle Hinweise wären sehr geschätzt. Vielen Dank.

- (void)viewDidLoad
{
    [super viewDidLoad];
    //Do any additional setup after loading the view, typically from a nib.

    motionManager = [[CMMotionManager alloc] init];
    if(motionManager.accelerometerAvailable)
    {
        motionManager.accelerometerUpdateInterval = 0.1;
        NSOperationQueue *motionQueue = [[NSOperationQueue alloc] init]; 
        [motionManager startAccelerometerUpdatesToQueue: motionQueue withHandler: ^(CMAccelerometerData *data, NSError *error) 
         {
             float accelerationThreshold = 1.2;

             CMAcceleration userAcceleration = data.acceleration;
             if (fabs(userAcceleration.x) > accelerationThreshold)               
             {
                 NSLog(@"Got here"); //runs
                 [self performSelector:@selector(test) withObject:nil afterDelay:1.0];
             }
         }];
    }
}

-(void) test
{
    NSLog(@"perform selector after delay worked"); //doesn't run
}
War es hilfreich?

Lösung

Ich bin am Ende dort angekommen (nachdem ich zum ersten Mal mit der Idee gespielt hatte, die UIACCelerator -Methode zum Zugriff auf den Beschleunigungsmesser zu verwenden - aber dann festzustellen, dass dies in zukünftigen iOS -Releases veraltet sein soll (siehe Abschnitt "Bewegungsereignisstypen". hier)

Grundsätzlich kann der Code im Block, der bei der Erkennung der Bewegung ausgeführt wird, möglicherweise nicht im Haupt -Thread ausgeführt, was zu Problemen führen kann, insbesondere mit dem von UIView verwandten Code.

Der Weg, um sicherzustellen, dass der Code im Haupt -Thread ausgeführt wird, besteht darin, anzurufen:

[self performSelectorOnMainThread:@selector(test) withObject:nil waitUntilDone:false]; 

statt der Normalität:

[self performSelector:@selector(test) withObject:nil afterDelay:1.0]; 

Oh, ich fand die Lösung in einem Google Books -Auszug aus dem ausgezeichneten Aussehen Beginn des iPhone 4 Entwicklung: Erkundung des iOS SDK. Hoffentlich kann dies für Menschen, die im selben Bereich zu kämpfen haben, von Nutzen sein. Wenn Sie weitere Informationen / Code wünschen.

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