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<[Particulars], NSError>)
并将我的 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 downloadProgress 完成处理程序到异步/等待