2017-05-05 133 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

但是,因为它是异步的,我不能存储变量,因为请求在打印后结束。你将如何设置你的信号量?或者别的什么可能? –

相关问题