2016-11-23 6 views
0

テーブルビューを再読み込みする前に、この2つの要求を完了しています(テーブルビューは両方に依存します)。テーブルビューをリロードする前に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(timeout:.distantFuture)"は私に警告を出していました。 "wait(timeout :)の呼び出し結果は未使用"で、このように変更しました: "_ = semaphore.wait(timeout:。遠い将来)" – 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() 
} 
関連する問題