2016-11-23 39 views
0

我有這2個要求重新加載表視圖之前完成(表視圖取決於他們兩個)。重新加載表視圖之前完成了兩個服務器請求

我試過像下面這樣,但它不起作用。

請求1被完成,那麼之前的所有表視圖重新加載在請求2.

DispatchQueue.global(qos: DispatchQoS.QoSClass.default).async { 
     //1. request 1: 
     self.serverRequestAuth("/request1") 
     //2. request 2: 
     self.serverRequestAuth("/request2") 
      DispatchQueue.main.async{ 
       //3. reload the table view 
       self.tableView.reloadData() 
      } 
    } 

正在做的如何我我應該繼續?

提及:serverRequestAuth包含服務器請求,解析json,解析其中的字典。

的方法serverRequestAuth:

func serverRequestAuth(_ requestName: String){ 
    let requestNameEscaped = requestName.addingPercentEncoding(withAllowedCharacters: CharacterSet.urlQueryAllowed)! 


    var request = NSMutableURLRequest() 
    request = NSMutableURLRequest(url: URL(string: "\(self.view.getServerPath())\(requestNameEscaped)")!, cachePolicy: NSURLRequest.CachePolicy.reloadIgnoringLocalCacheData, timeoutInterval: 5) 

    request.httpMethod = "GET" 
    request.setValue(self.view.getAuth(), forHTTPHeaderField: "Authorization") 
    request.setValue("application/json", forHTTPHeaderField: "Content-Type") 

    let task = URLSession.shared.dataTask(with: request as URLRequest) {data, response, err in 
     if data != nil { 
      if let dictionary = self.parseJSONData(data!) { 
       self.parseDictionary(dictionary, typeOfRequest: requestName) 
      } 
     } 
    } 
    task.resume() 
} 

回答

0

嘗試使用DispatchSemaphore

func serverRequestAuth(_ requestName: String){ 
    let requestNameEscaped = requestName.addingPercentEncoding(withAllowedCharacters: CharacterSet.urlQueryAllowed)! 

    let semaphore = DispatchSemaphore(value: 0); 
    var request = NSMutableURLRequest() 
    request = NSMutableURLRequest(url: URL(string: "\(self.view.getServerPath())\(requestNameEscaped)")!, cachePolicy: NSURLRequest.CachePolicy.reloadIgnoringLocalCacheData, timeoutInterval: 5) 

    request.httpMethod = "GET" 
    request.setValue(self.view.getAuth(), forHTTPHeaderField: "Authorization") 
    request.setValue("application/json", forHTTPHeaderField: "Content-Type") 

    let task = URLSession.shared.dataTask(with: request as URLRequest) {data, response, err in 
     if data != nil { 
      if let dictionary = self.parseJSONData(data!) { 
       self.parseDictionary(dictionary, typeOfRequest: requestName) 
       semaphore.signal(); 
      } 
     } 
    } 
    task.resume() 
    semaphore.wait(timeout: .distantFuture) 
} 
+1

我嘗試了所有的答案,這是爲我工作的人,與提那「semaphore.wait(超時:.distantFuture)」給我一個警告:「結果調用'等待(超時:)'未使用」,我改變它是這樣的:「_ = semaphore.wait(超時:。遙遠的未來)」 – asheyla

0

試試這個:

func serverRequestAuth(_ requestName: String, control:@escaping (_ check : Bool)-> Void){ 
    let requestNameEscaped = requestName.addingPercentEncoding(withAllowedCharacters: CharacterSet.urlQueryAllowed)! 


    var request = NSMutableURLRequest() 
    request = NSMutableURLRequest(url: URL(string: "\(self.view.getServerPath())\(requestNameEscaped)")!, cachePolicy: NSURLRequest.CachePolicy.reloadIgnoringLocalCacheData, timeoutInterval: 5) 

    request.httpMethod = "GET" 
    request.setValue(self.view.getAuth(), forHTTPHeaderField: "Authorization") 
    request.setValue("application/json", forHTTPHeaderField: "Content-Type") 

    let task = URLSession.shared.dataTask(with: request as URLRequest) {data, response, err in 
     if data != nil { 
      if let dictionary = self.parseJSONData(data!) { 
       self.parseDictionary(dictionary, typeOfRequest: requestName) 
       control(true) 
      }else{ 

       control(false) 
      } 
     } 
    } 
    task.resume() 
} 

,您可以與調用它:

serverRequestAuth("myStringRequest1", control: {(check)in 

     if check { 
      self.serverRequestAuth("myStringRequest2", control: {(check) in 

       if check { 

        self.tableView.reloadData() 

       }else{ 

        print("error Request 2") 
       } 
      }) 


     }else { 

      print("error request 1") 

     } 
    }) 
0

我曾經有過類似的問題。爲了提供一個簡單的解決方案,我寫了這個小庫:

https://github.com/prine/ROConcurrency

您可以組的任務請求和等待所有請求完成,然後重新裝入表。

var taskRequest1 = TaskComplex { (finished) ->() in 
    self.serverRequestAuth("/request1", finished) 
} 

var taskRequest2 = TaskComplex { (finished) ->() in 
    self.serverRequestAuth("/request2", finished) 
} 

var reloadTable = TaskComplex { (finished) ->() in 
    DispatchQueue.main.async{ 
     // 3. reload the table view 
     self.tableView.reloadData() 
     finished() 
    } 
} 

var barrierComplex = BarrierComplex(tasks: [taskRequest1, taskRequest2], afterTask: reloadTable) 
barrierComplex.startTasks() 

你serverRequestAuth方法需要知道什麼時候它的異步完成,所以你需要添加完成的回調:

func serverRequestAuth(_ requestName: String, _ finished:(Bool) ->()) { 
    let requestNameEscaped = requestName.addingPercentEncoding(withAllowedCharacters: CharacterSet.urlQueryAllowed)! 


    var request = NSMutableURLRequest() 
    request = NSMutableURLRequest(url: URL(string: "\(self.view.getServerPath())\(requestNameEscaped)")!, cachePolicy: NSURLRequest.CachePolicy.reloadIgnoringLocalCacheData, timeoutInterval: 5) 

    request.httpMethod = "GET" 
    request.setValue(self.view.getAuth(), forHTTPHeaderField: "Authorization") 
    request.setValue("application/json", forHTTPHeaderField: "Content-Type") 

    let task = URLSession.shared.dataTask(with: request as URLRequest) {data, response, err in 
     if data != nil { 
      if let dictionary = self.parseJSONData(data!) { 
       self.parseDictionary(dictionary, typeOfRequest: requestName) 

       // Here you call finished to tell the Barrier that its finished 
       finished() 
      } 
     } 
    } 
    task.resume() 
} 
相關問題