2017-05-05 173 views
-1

我對Swift 3很陌生,我必須對我的API做GET請求。我正在使用Alamofire,它使用異步功能。線程1:信號SIGABRT alamofire

我做同樣的在我的Android應用程序,而GET返回JSON數據

這是我在SWIFT代碼:

 func getValueJSON() -> JSON { 
     var res = JSON({}) 
     let myGroup = DispatchGroup() 
     myGroup.enter() 
     Alamofire.request(url_).responseJSON { response in 
      res = response.result.value as! JSON 
      print("first result", res) 
      myGroup.leave() 
     } 
     myGroup.notify(queue: .main) { 
      print("Finished all requests.", res) 
     } 
     print("second result", res) 
     return res 
    } 

但我有與線有問題「RES =響應.result.value「給我的錯誤:線程1:信號SIGABRT

我真的不明白從哪裏來的問題,這是很難做一個」同步「功能,也許我這樣做錯誤。

我的目標是將請求的結果存儲在我返回的變量中。任何人都可以幫忙

回答

0

我建議您將Alamofire和SwiftyJSON一起使用,因爲這樣您可以更輕鬆地解析JSON。

這裏有一個經典的例子:

Alamofire.request("http://example.net", method: .get).responseJSON { response in 
    switch response.result { 
    case .success(let value): 
     let json = JSON(value) 
     print("JSON: \(json)") 
    case .failure(let error): 
     print(error) 
    } 
} 

如果你需要傳遞parameters,或headers,只是將其添加在request方法。

let headers: HTTPHeaders = [ 
     "Content-Type:": "application/json" 
] 

let parameters: [String: Any] = [ 
     "key": "value" 
] 

所以你的要求會是這樣的(這是POST請求):

Alamofire.request("http://example.net", method: .post, parameters: parameters, encoding: JSONEncoding.default, headers: headers).responseJSON { response in 

switch response.result { 

     case .success(let value): 
      print(value) 
     case .failure(let error): 
      print(error) 
    } 
} 

我沒有測試它,但它應該工作。另外,如果您希望允許通過HTTP協議進行請求,則需要將allow arbitary load設置爲yesApp Transport Security Settings,位於info.plist)。

這不被推薦,但它的發展很好。

+0

這似乎沒問題,但我怎麼能返回一個變量,我在循環中聲明?當我在其他地方宣佈它時,我有線程錯誤 –

+0

我通常會聲明一個類屬性。 '''var結果:JSON = []'''和下面我只是在'''.success(let value)'''case中添加'''self.results = JSON(value)'''',所以我可以稍後使用它。但是這需要'''''SwiftyJSON'''。 – Nedim

+0

但是,因爲它是異步的,我不能存儲變量,因爲請求在打印後結束。你將如何設置你的信號量?或者別的什麼可能? –