2 Stimmen

Problem mit GCD und lokaler UI-Aktualisierung

Ich habe folgenden Code erhalten

-(void)changeText
{

  dispatch_queue_t gqueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0);

  dispatch_async(gqueue, ^(void){
    //simulate a network traffic delay
    [NSThread sleepForTimeInterval:5];
    NSLog(@"start executing");
    self.mylabel.text = @"Yeah! Text Changed";
    NSLog(@"stop exec");
  });
}

Das Problem ist, dass es zu viel Zeit in Anspruch nimmt, den Beschriftungstext zu ändern, als dies normalerweise der Fall ist. Wenn ich Haupt-Warteschlange verwenden, wird es sofort tun, aber UI wird für 5 Sekunden blockiert werden.

Was ist der richtige Weg, um GCD zu verwenden, so dass ich Sachen in einem anderen Thread herunterladen kann, mein UI wird nicht blockiert, und sobald meine Arbeit getan, mein UI wird sofort ändern?

5voto

Rob Napier Punkte 265102

Sie können keine UIKit-Objekte (wie z. B. UILabel ) auf einem Hintergrundfaden. Das obige sollte sein:

-(void)changeText
{

  dispatch_queue_t gqueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0);

  dispatch_async(gqueue, ^(void){
    //simulate a network traffic delay
    [NSThread sleepForTimeInterval:5];
    NSLog(@"start executing");
    dispatch_async(dispatch_get_main_queue(), ^{
      self.mylabel.text = @"Yeah! Text Changed"; });
    NSLog(@"stop exec");
  });
}

Sie können auch Folgendes verwenden dispatch_sync statt display_async um zu warten, bis der Hauptthread die Änderung verarbeitet hat, aber Vorsicht vor Deadlocks.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X