2017-04-04 137 views
-1

不工作我试图让我的代码dispatchgroup工作DispatchGroup斯威夫特3

let dispatchQueue:DispatchQueue = DispatchQueue(label: "com.dispatchgroup", attributes: .concurrent, target: .main) 
var dispatchGroup:DispatchGroup = DispatchGroup() 
func renewLoginIfRequired()->String{ 
    self.dispatchGroup.enter() 
    dispatchQueue.async(group:dispatchGroup){ 
     self.authorizeApplication(completionHandler: { 
      self.dispatchGroup.leave() 
     }) 
    } 
    } 
    self.dispatchGroup.wait() // Stops execution here 
    return "Login Success" 
} 

上面的代码在self.dispatchGroup.wait停止执行()。没有运气 各地self.authorizeApplication以及我不知道我做错了什么: 我曾尝试相同的代码,而不dispatchQueue.async(dispatchGroup组)。这里有一点要提的是,self.authorizeApplication将使该功能

编辑1中的异步Web服务请求:

为了更详细的问题。我将从此方法返回会话令牌(字符串)。 这里是如果我使用通知或关闭它调用这个

func processPOSTRequest(_ urlString : String, isAnAuthReq:Bool = false, requestObject: Data?, onSuccess: @escaping (NSDictionary?, NSError?) -> Void, onFailure: @escaping (Data?, NSError?) -> Void){ 
    let manager = AFHTTPSessionManager() 
    let url = URL(string: urlString); 
    var request = URLRequest(url: url!); 
    if !isAnAuthReq{ 
     let token = self.renewLoginIfRequired() //-- Get new token before processing a webservice request 
     request.setValue(token, forHTTPHeaderField: "Authorization") 
    } 
    print("processing URl : "+urlString) 
    request.httpMethod="POST"; 
    request.httpBody = requestObject 
    request.setValue("application/json; charset=utf-8", forHTTPHeaderField:"Content-Type") 
    request.setValue("application/json; charset=utf-8", forHTTPHeaderField:"Accept") 
    let task = manager.dataTask(with: request, uploadProgress: nil, downloadProgress: nil, completionHandler:{ data, response, error in 
     if(error == nil){ 
      if let responseCode = (data as? HTTPURLResponse)?.statusCode{ 
       if responseCode != 200 || !((response as? [String: Any])?["success"] as? Bool)!{ 
        let errorResponse = NSError() 
        print("Response received for URL: "+urlString) 
        onFailure(nil, errorResponse.addItemsToUserInfo(newUserInfo: ["errorCode":String(responseCode)])) 
       } 
       else{ 
        onSuccess(response as! NSDictionary?, nil) 
       } 
      } 

     } 
     else{ 
      onFailure(nil, error as NSError?) 

     } 
    }) 
    task.resume() 
} 

功能。我怎样才能做到这一点?我已经尝试了他们两个

+0

不要这样做。使用完成处理程序。 – vadian

+0

在我看来,你尝试在这里实现信号量。为什么不使用'DispatchSemaphore'来达到你的目的? –

+1

您是否尝试过使用'dispatchGroup.notify()'而不是'dispatchGroup.wait()'? –

回答

1

我不知道authorizeApplication请求的底层是什么,但它很可能是它的回调在主线程中执行,也就是在主队列中。所以你进入,离开并在同一队列中等待,因此在你调用self.dispatchGroup.wait()之后你不能达到self.dispatchGroup.leave()

要处理,你需要重新设计异步请求,并在后台队列呼叫self.dispatchGroup.leave()