2017-08-16 116 views
0

我有一些麻烦,下面的代码。 虽然它的工作,但有一些时间问题。session.dataTask同步问题

首先让我说什么,我希望,我想数据下载完成后,我的形象准备使用时,完成处理程序应该运行。但现实似乎完全不同。当我尝试它时,完成处理程序立即被调用(我可以在控制台中看到'All OK'),就好像一切都是即时的。但图像实际上显示得更晚。我错过了什么?

let imageURL = URL(string: myURLString) 
session = URLSession.shared, 
_ = session.dataTask(with: imageURL) {[weak self] 
    (data: Data?, response: URLResponse?, error: Error?) in 
    if error == nil { 
     print("All OK") 
     self?.theImage = UIImage(data: data!) 
     self?.theView.image = self?.theImage 
    } else {print(error!)} 

    DispatchQueue.main.async { 
     self?.activityIndicator.stopAnimating() 
     self?.theView.setNeedsDisplay() 
    } 
    }.resume() 
+0

当数据从服务器加载并可用时,处理程序将再次被调用。你还应该在最后一个大括号之前添加session.finishTasksAndInvalidate().resume() –

+0

好的。 “处理程序会再次被调用”是什么意思?它已被调用。应该被称为多次? – Michel

+0

当数据被提取时,控件再次到达处理程序。另外,self?.theView.image = self?.Image应该在主线程上。你使用的是哪个版本的swift? –

回答

1

你可以试试这段代码吗?

控制不应实际往里走在第一次调用处理程序。我认为有代码中的一些错误,以及我刚才所指出的,尤其是在主线程需要更新UI

let session : URLSession 
    let config = URLSessionConfiguration.default 
    var resultFromServer: Any? 
    let responseResultData = [String:Any]() 
    session = URLSession(configuration: config, delegate: nil, delegateQueue: nil) 
    session.dataTask(with: request) { (data, response, error) in 

     if error != nil { 

      DispatchQueue.main.async(execute: { 

       session.invalidateAndCancel() 

      }) 

     }else{ 

      let httpResponse: HTTPURLResponse = response as! HTTPURLResponse 

       do{ 

        resultFromServer = try JSONSerialization.jsonObject(with: data!, options: JSONSerialization.ReadingOptions.mutableContainers) 
        if httpResponse.statusCode == 200 || httpResponse.statusCode == 201 || httpResponse.statusCode == 202 || httpResponse.statusCode == 204 || httpResponse.statusCode == 203 { 

         if let respArr = resultFromServer as? [Any]{ 

          //resp is array 


         }else if let respdict = resultFromServer as? [String : Any] { 

          //resp is dict 


         }else{ 

          //resp is something else maybe string, etc 

         } 

        } 
        else { 


         //error status code something like 500, 404, etc 

        } 


       } 

       catch let error as NSError { 

        DispatchQueue.main.async(execute: { 

         session.invalidateAndCancel() 

        }) 
       } 

      } 

     session.finishTasksAndInvalidate() 
     }.resume()