2016-07-28 69 views
0

我遇到了問題NSURLSession.sharedSession().dataTaskWithRequest(request)。我想對一些API驗證我的應用程序,如果驗證成功,那麼應用程序將允許用戶授權健康工具包並最終從那裏獲取一些數據。最後執行的NSURLSession.sharedSession()。dataTaskWithRequest(請求)

我有這個在我的viewDidLoad()

print ("AUTHORIZING APIGEE!!!") 
authorizeApigee() 
if (self.errorApigee == 0) { 
    print ("APIGEE AUTHORIZED!") 
    // We cannot access the user's HealthKit data without specific permission. 
    print ("AUTHORIZING HEALTHKIT!!") 
    getHealthKitPermission() 
    print ("HEALTHKIT AUTORIZED!") 
} else { 
    print ("APIGEE UNAUTHORIZED!") 
} 

,這是審覈功能:

// Authenticating app with Apigee Health APIx 
func authorizeApigee(){ 
     // Send HTTP GET Request 


     let scriptUrl = "https://fhirsandbox-prod.apigee.net/oauth/v2" 
     let urlWithParams = scriptUrl + "/accesstoken?grant_type=client_credentials" 
     let myUrl = NSURL(string: urlWithParams); 

     let request = NSMutableURLRequest(URL:myUrl!); 
     request.HTTPMethod = "POST" 

     // Add Basic Authorization 

     let username = "****" 
     let password = "****" 
     let loginString = NSString(format: "%@:%@", username, password) 
     let loginData: NSData = loginString.dataUsingEncoding(NSUTF8StringEncoding)! 
     let base64LoginString = loginData.base64EncodedStringWithOptions(NSDataBase64EncodingOptions()) 
     request.setValue(base64LoginString, forHTTPHeaderField: "Authorization") 

     let task = NSURLSession.sharedSession().dataTaskWithRequest(request) { 
      data, response, error in 

      // Check for error 
      if error != nil 
      { 
       self.errorApigee = 1 
       print("error=\(error)") 
       return 
      } 

      // Print out response string 
      let responseString = NSString(data: data!, encoding: NSUTF8StringEncoding) 
      print("responseString = \(responseString)") 
     } 
     task.resume() 
    } 

的問題是,即使authorizeApigee()被調用時,應用程序停止在NSURLSession.sharedSession().dataTaskWithRequest(request),超出該功能,顯然errorApigee變量不會更新,因此它會進入授權健康工具包的授權Apigee的下一個步驟。最後,當健康工具包獲得授權時,它會返回並授權Apigee。

任何想法爲什麼這可能發生在所有? 任何提示將不勝感激!

+3

'authorizeApigee()'是異步。所以'getHealthKitPermission()'將在它獲取請求值之前調用... – Larme

+0

任何想法如何解決這個問題? – KeykoYume

回答

1

這是簡單的例子,如何使用completion

func authorizeApigee(completion: (auth: Bool) -> Void) { 
      // Send HTTP GET Request 
    let scriptUrl = "https://fhirsandbox-prod.apigee.net/oauth/v2" 
    let urlWithParams = scriptUrl + "/accesstoken?grant_type=client_credentials" 
    let myUrl = NSURL(string: urlWithParams); 

    let request = NSMutableURLRequest(URL:myUrl!); 
    request.HTTPMethod = "POST" 

    // Add Basic Authorization 

    let username = "****" 
    let password = "****" 
    let loginString = NSString(format: "%@:%@", username, password) 
    let loginData: NSData = loginString.dataUsingEncoding(NSUTF8StringEncoding)! 
    let base64LoginString = loginData.base64EncodedStringWithOptions(NSDataBase64EncodingOptions()) 
    request.setValue(base64LoginString, forHTTPHeaderField: "Authorization") 

    let task = NSURLSession.sharedSession().dataTaskWithRequest(request) { 
     data, response, error in 

     // Check for error 
     if error != nil 
     { 
      self.errorApigee = 1 
      print("error=\(error)") 
      completion(auth: false) 
     } 

     // Print out response string 
     let responseString = NSString(data: data!, encoding: NSUTF8StringEncoding) 
     print("responseString = \(responseString)") 
     completion(auth: true) 
    } 
    task.resume() 
} 

以及如何使用:

self.authorizeApigee { (auth) -> Void in 
     if (auth) { 
      getHealthKitPermission() 
     } else { 
      //print errors 
     } 
    } 
+0

如果你想縮短這個時間,你可以只使用'auth in'而不是'(auth) - > Void in',你也可以去掉'if(auth)'語句中的括號 – kabiroberai

1

NSURLSession.sharedSession()dataTaskWithRequest()在另一個線程中執行。這樣主應用程序線程就不會掛起並等待請求完成。如果您希望在異步任務完成後運行代碼塊,我建議您使用完成塊。

1

你需要使用閉包,因爲API中async方式調用工作,所以首先改變你的函數定義,比如

func authorizeApigee(completion: (Int) ->()){ 
    let scriptUrl = "https://fhirsandbox-prod.apigee.net/oauth/v2" 
    let urlWithParams = scriptUrl + "/accesstoken?grant_type=client_credentials" 
    let myUrl = NSURL(string: urlWithParams); 

    let request = NSMutableURLRequest(URL:myUrl!); 
    request.HTTPMethod = "POST" 

    // Add Basic Authorization 

    let username = "****" 
    let password = "****" 
    let loginString = NSString(format: "%@:%@", username, password) 
    let loginData: NSData = loginString.dataUsingEncoding(NSUTF8StringEncoding)! 
    let base64LoginString = loginData.base64EncodedStringWithOptions(NSDataBase64EncodingOptions()) 
    request.setValue(base64LoginString, forHTTPHeaderField: "Authorization") 

    let task = NSURLSession.sharedSession().dataTaskWithRequest(request) { 
     data, response, error in 

     // Check for error 
     if error != nil 
     { 
      completion(0) 
      print("error=\(error)") 
      return 
     } 
     // Print out response string 
     let responseString = NSString(data: data!, encoding: NSUTF8StringEncoding) 
     print("responseString = \(responseString)") 
     completion(1) 
    } 
    task.resume() 
} 

現在打電話給你的函數類似這樣的

self.authorizeApigee() { (result) ->() in 
    if result == 0 { 
      print ("APIGEE AUTHORIZED!") 
      // We cannot access the user's HealthKit data without specific permission. 
      print ("AUTHORIZING HEALTHKIT!!") 
      getHealthKitPermission() 
      print ("HEALTHKIT AUTORIZED!") 
     } else { 
      print ("APIGEE UNAUTHORIZED!") 
     } 
}