0

In Swift 2.0 verwende ich eine Web-API zum Hochladen und Herunterladen von Daten. Bevor ich die API aufgerufen habe, habe ich eine Animationsanimationsanimation gestartet und möchte sie stoppen, wenn die Antwort der API gekommen ist.animateWithDuration Anruf nach einer langen Zeit, wenn es in URLSession geschrieben wird

Wenn ich jedoch die Animation nach der API-Antwort stoppen möchte, stoppt die Anzeige nach einer langen Wartezeit.

Hier ist mein Code:

let activityIndi = UIActivityIndicatorView(activityIndicatorStyle: .White) 
    activityIndi.startAnimating() 
    flagBtn.addSubview(activityIndi) 
    let urlString = NSURL(string: "URL") 
    NSURLSession.sharedSession().dataTaskWithURL(urlString!, completionHandler: { (data: NSData?, _, _) -> Void in 
     if data != nil { 
      do { 
       let jsonInfoDic = try NSJSONSerialization.JSONObjectWithData(data!, options: .AllowFragments) as! [String:AnyObject] 
       if(jsonInfoDic["status"] as! Bool) 
       { 
        UIView.animateWithDuration(1.0, animations: { 
         activityIndi.stopAnimating() 
         }, completion:{ (finished: Bool) -> Void in 
        }) 
       } 
      } 
      catch { print("Exception in parsing JSON.\n\nReason: \(error)") } 
     } 
    }).resume() 

Antwort

2

Sie benötigen UI-modifizierende Operationen auf dem Haupt-Thread auszuführen. Da der Rückruf von dataTaskWithURL:completionHandler: auf einem Hintergrundthread (NSURLSession Gewinde) durchgeführt wird, müssen Sie den UI-Code versenden wie folgt:

dispatch_async(dispatch_get_main_queue()) { 
    activityIndi.stopAnimating() 
} 

Außerdem vermute ich, werden Sie nicht brauchen UIView.animateWithDuration:completion: weil stopAnimating selbst eine Animation durchführt.

Verwandte Themen