2014-11-15 11 views
31

ben basıldığında Gönder düğmesini benim loginViewController bu çağrıyı sahip sınıftır HTTPHelperwaitUntilAllTasksAreFinished hata Swift

func checkLogin(succeed: Bool, msg: String){ 
    if (succeed){ 
     self.performSegueWithIdentifier("logInTrue", sender: self) 
    } 
} 

sonrası fonksiyonudur :

func post(url : String, postCompleted : (succeeded: Bool, msg: String) ->()) { 
    var request = NSMutableURLRequest(URL: NSURL(string: url)!) 
    var session = NSURLSession.sharedSession() 
    request.HTTPMethod = "POST" 
    var err: NSError? 
    self.task = session.dataTaskWithURL(NSURL(string: url)!) {(data, response, error) in 
     var strData = NSString(data: data, encoding: NSUTF8StringEncoding) 
     var err: NSError? 
     var json = NSJSONSerialization.JSONObjectWithData(data, options: .AllowFragments, error: &err) as? NSDictionary 
     var msg = "No message" 
     // Did the JSONObjectWithData constructor return an error? If so, log the error to the console 
     if(err != nil) { 
      let jsonStr = NSString(data: data, encoding: NSUTF8StringEncoding) 
      postCompleted(succeeded: false, msg: "Error") 
     } 
     else { 
      // The JSONObjectWithData constructor didn't return an error. But, we should still 
      // check and make sure that json has a value using optional binding. 
      if let parseJSON = json { 
       // Okay, the parsedJSON is here, let's get the value for 'success' out of it 
       if let success = parseJSON["result"] as? Bool { 
        postCompleted(succeeded: success, msg: "Logged in.") 
       } 
       return 
      } 
      else { 
       // Woa, okay the json object was nil, something went worng. Maybe the server isn't running? 
       let jsonStr = NSString(data: data, encoding: NSUTF8StringEncoding) 
       postCompleted(succeeded: false, msg: "Error") 
      } 
     } 
    } 

    self.task!.resume() 
} 

checkLogin işlevi başarıyla çağrıldığında s: - [UIKeyboardTaskQueue waitUntilAllTasksAreFinished], /SourceCache/UIKit_Sim/UIKit-3318.16.14/Keyboard/UIKeyboardTaskQueue.m:374 içinde

Onaylama yetmezliği: true o fonksiyonu .. hata benziyor performSegueWithIdentified başarısız 2014-11-15 17: 41: 29.540 Wavesss [8462: 846477] *** Uygulanamayan istisna 'NSInternalInconsistencyException' nedeniyle sona eren uygulama, nedeni: '- [UIKeyboardTaskQueue waitUntilAllTasksAreFinished] sadece ana konudan çağrılabilir.' url görev yine de diğer iş parçacığı üzerinde gerçekleştirilirken ben görünümü denetleyicileri arasında geçemez gibi

Bunun için bir çözüm bulmak çok zor mücadele ediyorum gerçi bana yardım edin, görünüyor. şimdiden teşekkürler!

cevap

59

checkLogin işleviniz başka bir iş parçacığında çağrılıyor, bu nedenle self.performSegueWithIdentifier numaralı telefonu arayabilmeniz için ana iş parçacığına geri dönmeniz gerekiyor. Ben NSOperationQueue kullanmayı tercih: Ben de aynı sorunu yaşıyordu

func checkLogin(succeed: Bool, msg: String) { 
    if (succeed) { 
     NSOperationQueue.mainQueue().addOperationWithBlock { 
      self.performSegueWithIdentifier("logInTrue", sender: self) 
     }   
    } 
} 
+2

vardı, bu koymak – Isabelle

1

, cevap yukarıdan referans alınarak çözüldü gördü.

OperationQueue.main.addOperation{ 
    <your segue or function call> 
} 
14

@Nate ederiz, bu şu yapı için modifiye edilmiştir bir Async Görevinin içinde.

DispatchQueue (Xcode 8.0 ve Swift 3.0) kullanılarak Çözelti: {OperationQueue.main.addOperation:

DispatchQueue.main.asyncAfter(deadline: .now() + 0.1) { 
     self.textBox.text = "Some Value" 
     } 
0

ben bir metin kutusunun içeriğini değiştirmeye çalışırken bu sorunu başlamıştı: Xcode 8.0 ve Swift 3 ile

var storyBoard: UIStoryboard = UIStoryboard(name: "Main", bundle: nil) 
var vc: UINavigationController = storyBoard.instantiateViewControllerWithIdentifier("AppViewController") as! UINavigationController 

NSOperationQueue.mainQueue().addOperationWithBlock { 
    self.presentViewController(vc, animated: true, completion: nil) 
}