Alamofire完成处理程序问题

时间:2016-05-24 03:30:36

标签: ios swift2 realm alamofire

我有一个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正在抛出此错误

  

无法转换类型&#39;字符串&#39;的值预期参数类型&#39;对象&#39;

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

1 个答案:

答案 0 :(得分: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)