Alamofire 完成处理程序问题

Posted

技术标签:

【中文标题】Alamofire 完成处理程序问题【英文标题】:Alamofire completion handler issue 【发布时间】:2016-05-24 03:30:36 【问题描述】:

我有一个 POST 请求,其中包含我想接收的某些数据。但是,当我使用 responseArray 时,我会抛出这个错误

json 数据为零

但是当我使用responseJSON 时,一切都会好起来的。为什么会这样?

此代码不起作用:

Alamofire.request(.POST, Data.todoEndpoint, parameters: parameters)
       .responseArray  (response: Response<[Particulars], NSError>) in

            print(response.request)
            print(response.response)
            print(response.result)


            if let result = response.result.value
            

                do
                    print(Realm.Configuration.defaultConfiguration.fileURL)
                    let realm = try Realm()
                    realm.add(result, update: true)
                

                catch let err as NSError 
                    print("Error with realm: " + err.localizedDescription)
                

            
            else
            
                print("JSON data is nil.")
            
    

但这很好:

Alamofire.request(.POST, Data.todoEndpoint, parameters: parameters)
       .responseJSON  response in

            print(response.request)
            print(response.response)
            print(response.result)


            if let result = response.result.value
            

              print(result)

            
            else
            
                print("JSON data is nil.")
            
    

我需要 responseArray 以便我可以拥有 (response: Response&lt;[Particulars], NSError&gt;) 并将我的 JSON 响应存储到领域

更新

这是我要连接的 Particulars 类。我正在尝试根据这篇文章 https://blog.hyphe.me/realm-and-alamofire-in-a-effective-harmony/ 将我的 JSON 对象映射到 Realm

import Foundation
import RealmSwift
import ObjectMapper


class Particulars: Object, Mappable 
dynamic var name = ""
dynamic var email = ""
dynamic var id = ""
dynamic var profilePicture = ""
dynamic var username = ""
dynamic var apiToken = ""


override static func primaryKey() -> String? 
    return "id"


//Impl. of Mappable protocol
required convenience init?(_ map: Map) 
    self.init()


func mapping(map: Map) 
    id    <- map["id"]
    name <- map["name"]
    email <- map["email"]
    profilePicture <- map["profile_picture"]
    username <- map["username"]
    apiToken <- map["api_token"]
 

这是 JSON 响应:

[
  "name" : "Jonny Walker",
  "api_token" : "qwertyuiop1234567890",
  "profile_picture" : "http:default_profile_picture.jpg",
  "id" : 10,
  "email" : "jwalker@gmail.com",
  "username" : "jonny"
]

更新 2

我的完成处理程序在 responseObject 上运行良好,但我的 realm.add xxx 抛出此错误

无法将“字符串”类型的值转换为预期的参数类型“对象”

我的代码可以在这里找到https://codeshare.io/v4M9M(第 19-25 行)

【问题讨论】:

【参考方案1】:

Alamofire 页面显示了如何处理响应,并没有列出 responseArray 方法。 https://github.com/Alamofire/Alamofire#response-serialization

您可以使用 responseJSON 来获取 JSON 并转换为您想要的数组。它看起来像这样,(根据您的 JSON 响应对此进行更改)

Alamofire.request(.POST, Data.todoEndpoint, parameters: parameters)
   .responseJSON  response in

        guard response.result.isSuccess else
        
              //handle error 
              return
        

        guard let value = response.result.value as? [String: AnyObject], 
                           particularsArrayJson = value["particulars"] as? [[String: AnyObject]] 
        else
               //Malformed JSON, handle this case
        

        var particulars = [Particulars]()
        for particularsDict  in paricularsArrayJson
              particulars.append(Pariculars(json:particularsDict))
        

您的详细信息中必须有一个初始化程序,该初始化程序将从提供的 JSON 进行初始化。

更新:

realm add 方法接受一个从 Object 扩展的类的实例 Object 是 Realm 提供的一个类。所以你可能需要更多地阅读文档。

你应该这样做

      realm.add(particulars, updated:true)

【讨论】:

嗨@Anirudh 我知道,但是根据我在网上找到的本教程(请参阅更新后的帖子)这是他们使用的(responseArray)也是我使用 Particulars 的原因是连接到我的 Particulars 类跨度> 你能更新你的 JSON 的整个结构吗?你的 JSON 是一个包含细节数组的对象还是只是一个细节数组。即是像 particualrs:[name:"",api_token:"",name:"",api_token:""] 或 [ name:"",api_token:"",名称:“”,api_token:“”] 这就是整个 JSON 响应。它是一组细节。问题是,我想将整个 JSON 响应添加到领域 您发布的 JSON 似乎不正确。它必须是 [,] 而不是 [name:"",...]。当您的意思是要存储整个 JSON 时,您希望将纯 JSON 文本存储到领域?如果是这样,您可以将 JSON 响应作为字符串获取并存储。您根本不需要 responseArray 调用。 我正在寻找的是将名称和令牌之类的数据传递到我的领域数据库的名称和令牌列中。这是否意味着我不必遍历字典?

以上是关于Alamofire 完成处理程序问题的主要内容,如果未能解决你的问题,请参考以下文章

Alamofire 完成处理程序问题

请求 Alamofire

AlamoFire downloadProgress 完成处理程序到异步/等待

如何在同一函数中为 2 个 Alamofire 请求只有 1 个完成处理程序

发送 Alamofire JSON 数组 Swift

Alamofire 请求最初返回值,但在通过完成处理程序时被接收为 nil