2016-06-02 6 views
0

Nachdem ich eine bestimmte Google Youtube-Bibliothek angerufen habe, reagiert meine Anwendung nach einem Callback plötzlich nicht mehr.Plötzlich reagiert die iOS App überhaupt nicht mehr

Nicht reagierend bedeutet, dass nicht alle UI-Komponenten angeklickt werden können.

Gibt es in iOS so etwas, das den gesamten Bildschirm deaktivieren kann, um überhaupt nicht zu reagieren?

Der Code:

self.uploadFileTicket = [service executeQuery:query 
           completionHandler:^(GTLServiceTicket *ticket, 
                GTLYouTubeVideo *uploadedVideo, 
                NSError *error) { 
            // Callback 
            _uploadFileTicket = nil; 

            if (error == nil) { 
             [_delegate videoUploadedSuccessfully:YES error:nil]; 

            } else { 
             [_delegate videoUploadedSuccessfully:NO error:error.description]; 
            } 
           }]; 

In meinem Viewcontroller:

- (void)videoUploadedSuccessfully:(BOOL)success error:(NSString *)errorMessage{ 
    dispatch_async(dispatch_get_main_queue(), ^{ 
    if(success){ 
     UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Youtube" 
                 message:@"Video uploaded successfully" 
                delegate:nil 
              cancelButtonTitle:nil 
              otherButtonTitles:@"OK", nil]; 
     [alert show]; 
    } 
    else{ 
     UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Youtube" 
                 message:errorMessage 
                delegate:nil 
              cancelButtonTitle:nil 
              otherButtonTitles:@"OK", nil]; 
     [alert show]; 
    } 
    }); 
} 

aktualisieren

Ich habe mit Instrument versucht und bekam folgende:

Thread

Bedeutet dies, dass mein Arbeitsfaden den Hauptfaden blockiert?

+0

Zuerst einmal versuchen, den gesamten Code zu kommentieren und –

+0

setzen Haltepunkt setzen und überprüfen, in welchem ​​Thread-Prozess gestartet –

+0

Wenn ich den Aufruf auf Youtube-Bibliothek kommen, funktioniert es natürlich wieder lol – Rendy

Antwort

1

Endlich fand ich die ROOT Ursache dieses Problems. Es gibt irgendwo im Code, bevor das Video auf Youtube hochgeladen wird:

[[UIApplication sharedApplication] beginIgnoringInteractionEvents]; 
0

Ich kann das Problem nicht lokalisieren. Aber, hier sind einige meiner Vorschläge.

Der Methodenaufruf [service executeQuery:query completionHandler: verfügt über einen Beendigungshandler. Daher ist es meistens eine asynchrone Aufgabe. Daher sollte die Aufgabe des Dienstes in einem Hintergrundthread ausgeführt werden und die Benutzeroberfläche nicht blockieren.

Falls Sie nicht sicher sind, ob der Anruf im Hauptthread ist, verwenden Sie das folgende LOC zur Klärung.

[NSThread isMainThread] gibt nur dann true zurück, wenn der ausführende Thread der Hauptthread/UI-Thread ist.

Können Sie auch bei videoUploadedSuccessfully einen NSLog einfügen und prüfen, ob die Delegate-Methode mehrmals aufgerufen wird?

Sie brauchen nicht den Block

dispatch_async(dispatch_get_main_queue(), ^{} 

Die delegierte Methode auf dem Haupt-Thread ausgeführt bekommen sollte sich solange Sie den Service-Abfrage-Methode auf dem Haupt-Thread sind aufgerufen wird.

Überprüfen Sie abschließend, ob Sie die [service executeQuery:query Methode aus dem Hauptthread aufrufen?

Verwandte Themen