2016-05-22 6 views
0

In meinem Code habe ich eine Funktion definiert, die das Delgate für Aktionen in einem Side-Menü ist, wenn Sie tippen Sie auf die Abmelden Aktion im Menü wird ausgeführt und die Funktion unten ist die Delegierten, die die Callback-Griffe:Swift self.performSegueWithIdentifier wird nach dem Zufallsprinzip nicht funktionieren

@objc func sideMenuAction(action: action) { 
     if(action == .Logout){ 
      dispatch_async(dispatch_get_main_queue(), {() -> Void in 
       self.performSegueWithIdentifier("unwindToLogin", sender: self) 
      }) 
     } 
} 

9 out of 10 mal das funktioniert gut und hat das erwartete Ergebnis des Benutzers zurück, die von wo auch immer in Navigationsstapel unwindToLogin Kennung im Storyboard hat view-Controller einzuloggen geworfen werden sie auch sein mögen. aber das 1 mal funktioniert es nicht, wenn self.performSegueWithIdentifier Zeile ausgeführt wird, passiert nichts! keine Fehler oder Warnungen und wenn dies passiert, wird die override func prepareForSegue nicht aufgerufen, nachdem die Zeile ausgeführt wird!

Die andere Sache, die ich bemerkt habe, ist, dass, wenn dieses Problem ausgelöst wird, die CPU-Auslastung bei weit über 100% bleibt. Die übliche CPU-Auslastung der Apps beträgt maximal 30%/40% für nicht mehr als 1/2 Sekunden.

Es ist schwierig zu reproduzieren und wenn es passiert, kann ich nicht herausfinden, was vor sich geht. Suchen Sie hier nach Hinweisen, um mögliche Ursachen zu finden.

Die Ansicht Hierarchie sieht aus, als einmal folgende ich in der Lage war, das Problem zu reproduzieren:

(lldb) expr -l objc++ -O -- [UIViewController _printHierarchy] 


    <SWRevealViewController 0x12585ea00>, state: appeared, view: <SWRevealView 0x1256f3c70> 
     | <demoApp.MenuViewController 0x12575daa0>, state: appeared, view: <UIView 0x12743e670> 
     | <UINavigationController 0x126047000>, state: appeared, view: <UILayoutContainerView 0x125755270> 
     | | <demoApp.InitialViewController 0x125760050>, state: disappeared, view: <UIView 0x1256e2b30> not in the window 
     | | <demoApp.MainViewController 0x1257f11f0>, state: disappeared, view: <UIView 0x1257f8df0> not in the window 
     | | <demoApp.DetailViewController 0x127617250>, state: appeared, view: <UIView 0x1274f2280> 

Ich sollte hinzufügen, dass die Anwendung zwei Strömungen hat die Auswirkungen der Ansicht Hierarchie:

Flow 1: User has never provided credential so Login View -> Initial View -> Main -> ...... 
    Flow 2: User has already logged in once so Initial View -> Main -> ....... 

Der " abrollToLogin "Bezeichner gehört zum Abwickeln IBAction von Login View-Controller

+0

Nur aus Neugier, warum haben Sie sich für dispatch_async entschieden? Ist die Ausführung nicht bereits im Hauptthread passiert? –

+0

@AksharPatel Ich habe paranoid den Grund, warum es nicht funktioniert, ist irgendwie zur Zeit der Ausführung Ich bin zufällig in einem Seiten-Thread und so auf der sicheren Seite habe ich hinzugefügt, um zu sehen, ob es Dinge behebt. Es hilft offensichtlich nicht. – ke3pup

+0

Sie haben die View-Controller-Hierarchie hinzugefügt. Großartig, also ist der Controller mit der Abwicklungsfunktion "IBAction" (nicht die, von der du kommst, sondern die, die du abwickelst) darin enthalten? Aus der Frage, welcher View Controller die Unclear "IBAction" implementiert hat, ist unklar. – Rob

Antwort

1

Dies kann passieren, wenn es die Abwicklungssequenz IBAction Methode nicht finden kann einen beliebigen View-Controller in der View-Controller-Hierarchie. Und das kann aus verschiedenen Gründen passieren. Vielleicht befindet sich der fragliche View-Controller überhaupt nicht in der View-Controller-Hierarchie. Oder vielleicht haben Sie von einem View-Controller auf einen anderen umgestellt, ohne die View-Controller-Hierarchie mit Ihrer View-Hierarchie synchron zu halten (z. B. wenn Sie von einem View-Controller zum anderen wechselten, indem Sie addSubview von einem View-Controller zu einem anderen View ohne die erforderliche addChildViewController) Anruf). Oder Sie haben den Root-View-Controller möglicherweise manuell ausgetauscht. Aber unter dem Strich, irgendwie, einige, wie, Ihre IBAction für die Abwickelstrecke ist nur nicht in jedem View-Controller in der vorhandenen Ansicht Controller-Hierarchie gefunden.

Der Schlüssel ist, zuerst eine Situation zu finden, in der dies geschieht. (Ich weiß, dass Sie sagen, es ist schwer zu reproduzieren, aber versuchen Sie es weiter, bis sich Ihr Problem manifestiert.) Sobald Sie dies getan haben, unterbrechen Sie die Ausführung und schauen sich die View-Controller-Hierarchie an. Zum Beispiel, drücken Sie die „Pause“ -Taste in Ihrem Debugger (oder einen Haltepunkt hinzufügen) und drucken Sie die Ansichtshierarchie durch folgende an der (lldb) Aufforderung eingeben, wenn in Swift Rahmen:

expr -l objc++ -O -- [UIViewController _printHierarchy] 

Oder wenn in Objective-C-Rahmen einfach wie folgt:

po [UIViewController _printHierarchy] 

Zum Beispiel:

enter image description here

Stellen Sie sicher Ihr Ziel-view-Controller erscheint in th Die View-Controller-Hierarchie.Mehr als wahrscheinlich, wird es nicht da sein, und sobald Sie dieses Problem bestätigt haben, müssen Sie zurückverfolgen und herausfinden, wie der fragliche View-Controller aus der View-Controller-Hierarchie ausgelassen wurde. Wenn Sie sich alle in der App vorkommenden View Controller-Übergänge ansehen, finden Sie möglicherweise einen, der den Standardübergang nicht ausführt.

+1

danke für den Vorschlag. Ich habe die Ausgabe des Befehls in die ursprüngliche Frage gestellt. Fällt etwas auf – ke3pup

Verwandte Themen