【问题标题】:Alamofire gives one extra itemAlamofire 提供了一件额外的物品
【发布时间】:2023-03-16 14:19:01
【问题描述】:

在服务器应用程序中,我有 12 个用户。但是如果我构建软,我有 12 个 id,但有 13 个名字,13 个姓氏,当然还有 13 个全名。但是如果我注销(这意味着删除整个数据)并再次登录,一切都很好,Alamofire 为我提供了 12 项。 API 很好,它在我的代码中。

数组示例: 身份证 [5、12、15、16、17、18、19、22、25、28、29、30]

姓氏 [、母鹿、威克​​、史密斯等]

所以 id 很好,但姓氏在其开头有一个备用项(doe 前的逗号表示一个备用项)。那么为什么会有一个额外的带有空白字符串的项目呢?

var firstnamesOfUsers: [String]!
var lastnamesOfUsers: [String]!
var idsOfUsers: [Int]!
var namesOfUsers: [String]!

func getUsers(){
        Alamofire.request(.GET, "https://\(domainText).projektove.cz/users.json", parameters: ["limit": 1000])
            .responseJSON { (request, response, JSONresponse, error) in
                if( error == nil){
                    var responseJSON = JSONresponse as NSMutableDictionary
                    let json = JSON(responseJSON)
                    var users = json["users"]
//                    println(users)

                    if users.count > 0 {
                        for index in 0...users.count-1 {
                            firstnamesOfUsers.append(users[index]["firstname"].stringValue)
                            lastnamesOfUsers.append(users[index]["lastname"].stringValue)
                            idsOfUsers.append(users[index]["id"].intValue)
                            namesOfUsers.append(users[index]["firstname"].stringValue + " " + users[index]["lastname"].stringValue)
                        }
                    }

                }
        }
    }

【问题讨论】:

  • 在填充数组后立即只有其中 1 个是正确的?或者应用程序中的其他代码稍后会更改数组?
  • 为什么要将各个字段拆分为单独的数组?为什么不创建一个User 模型对象并管理一组用户呢?
  • @Wain 不,除第一项外,每一项都是正确的。它是空项目(没有字符的字符串)。当我注销时,我将每个项目设置为空字段。例如:firstnamesOfUsers = [] 然后,如果我再次登录,一切都很好,该字段也可以。
  • @mattt 我知道这不是最佳实践,但我不了解建模对象的概念。

标签: ios swift alamofire


【解决方案1】:

您的代码示例有几个问题,最重要的是您缺少@mattt 已经指出的模型对象结构。你当然有机会在这里改进。下面是相同的逻辑,只是重新设计得更健壮一些。

用户

struct User {
    let id: Int
    let firstName: String
    let lastName: String
    var fullName: String { return "\(self.firstName) \(self.lastName)" }
}

用户服务

import Alamofire
import SwiftyJSON

class UserService {
    typealias GetUsersSuccessHandler = [User] -> Void
    typealias GetUsersFailureHandler = (NSURLRequest?, NSHTTPURLResponse?, NSError?) -> Void

    class func getUsers(#success: GetUsersSuccessHandler?, failure: GetUsersFailureHandler?) -> Request? {
        let domainText = "some_random_url"

        let request = Alamofire.request(.GET, "https://\(domainText).projektove.cz/users.json", parameters: ["limit": 1000])
        request.validate()
        request.responseJSON { request, response, jsonObject, error in
            if error != nil || jsonObject == nil {
                failure?(request, response, error)
                return
            }

            let json = JSON(jsonObject!)
            let jsonUsers = json["users"]

            var users = [User]()

            for jsonUser in jsonUsers.arrayValue {
                let id = jsonUser["id"].int
                let firstName = jsonUser["firstname"].string
                let lastName = jsonUser["lastname"].string

                if firstName != nil && lastName != nil && id != nil {
                    let user = User(id: id!, firstName: firstName!, lastName: lastName!)
                }
            }

            success?(users)
        }

        return request
    }
}

SomeClass

class SomeClass {
    func fetchUsers() {
        UserService.getUsers(
            success: { users in
                println("Fetched users: \(users)")
            },
            failure: { request, response, error in
                println("Failed to fetch users: \(error)")
            }
        )
    }
}

此代码示例已编译,因此请随意试一试。请特别注意User 模型对象的使用以及它是如何在responseJSON 完成处理程序中创建的。

希望这有助于您朝着正确的方向前进。

【讨论】:

  • 谢谢,但是我怎么称呼这个代码呢?我不明白这个异步的东西。
  • 抱歉,我用SomeClass 更新了答案,展示了如何轻松拨打UsersService。至于异步的东西,阅读 Swift 编程指南中的 this 文章将有助于与 this
  • 非常感谢。我会尽快尝试的。
猜你喜欢
  • 2020-09-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-08
  • 1970-01-01
  • 2022-10-07
  • 1970-01-01
相关资源
最近更新 更多