【问题标题】:Thread 1 : signal SIGABRT alamofire线程 1:信号 SIGABRT alamofire
【发布时间】:2017-05-05 14:30:09
【问题描述】:

我对 Swift 3 非常陌生,我必须在我的 API 上执行 GET 请求。我正在使用 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 = response.result.value”行有疑问,这给了我错误:线程 1:信号 SIGABRT

我真的不明白问题出在哪里,很难做到“同步”功能,也许我做错了。

我的目标是将请求的结果存储在我返回的变量中。任何人都可以帮忙吗?

【问题讨论】:

    标签: swift xcode multithreading http alamofire


    【解决方案1】:

    我建议您将 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 in info.plist)。

    不建议这样做,但对开发来说没问题。

    【讨论】:

    • 看起来没问题,但是如何返回我在循环中声明的变量?当我在其他地方声明它时,我有线程错误
    • 我通常声明一个类属性。 var results: JSON = [] 及以下我只是在.success(let value) 的情况下添加self.results = JSON(value),这样我以后可以使用它。但这需要SwiftyJSON
    • 但是,因为它是异步的,我无法存储变量,因为请求在我打印之后结束。你会如何设置你的信号量?或者别的什么?
    猜你喜欢
    • 1970-01-01
    • 2021-05-29
    • 1970-01-01
    • 1970-01-01
    • 2018-11-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多