将对象附加到变量

Posted

技术标签:

【中文标题】将对象附加到变量【英文标题】:Append object to a variable 【发布时间】:2015-10-17 22:21:22 【问题描述】:

我正在尝试将一个对象附加到一个对象数组中。

var products: [Product] = []

init() 
    Alamofire.request(.GET, Urls.menu).responseJSON  request in
        if let json = request.result.value 
            let data = JSON(json)

            for (_, subJson): (String, JSON) in data 
                let product = Product(id: subJson["id"].int!, name: subJson["name"].string!, description: subJson["description"].string!, price: subJson["price"].doubleValue)

                print(product)

                self.products.append(product)
            
        
    

    self.products.append(Product(id: 1, name: "test", description: "description", price: 1.0))

    print(self.products)

我正在循环通过我的 JSON 响应并创建 Product 对象,但是当我尝试附加到 products 变量时,它没有附加。

这是输出:

[Checkfood.Product]
Checkfood.Product
Checkfood.Product
Checkfood.Product
Checkfood.Product
Checkfood.Product

第一行代表print(self.products),其余为print(product)

谢谢

【问题讨论】:

您打印self.products 太快了。该行在异步请求完成之前很久就执行了。 @rmaddy 我有另一个函数,它只返回这个数组中的项目总数,当我不附加自己时它总是返回 0。 【参考方案1】:

“Alamofire 中的网络是异步完成的”是 API 描述的意思,它不是等待服务器的响应,而是在收到响应时调用处理程序,但与此同时代码执行无论如何都会继续。并且当调用处理程序时,只能在该处理程序中访问响应:-“请求的结果仅在响应处理程序的范围内可用。任何取决于从服务器接收到的响应或数据的执行都必须在一个处理程序”

如果您希望处理程序具有该优先级,您可以使用高优先级线程。以下是如何做到这一点:

Alamofire.request(.GET, Urls.menu).responseJSON  request in
    if let json = request.result.value     
        dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0)) 
            let data = JSON(son)
            var product: [Products] = []

            for (_, subJson): (String, JSON) in data 
                product += [Product(id: subJson["id"].int!, name: subJson["name"].string!, description: subJson["description"].string!, price: subJson["price"].doubleValue)]

                print(product)
            
            dispatch_async(dispatch_get_main_queue()) 
                self.products += product //since product is an array itself (not array element)
                //self.products.append(product)
            
        
    
    self.products.append(Product(id: 1, name: "test", description: "description", price: 1.0))

【讨论】:

self.products.append(product) 显示错误:Use of unresolved identifier product。我需要在调用 Alamofire 之前创建 product 变量吗? 哦,是的,否则它只在循环中声明。我会编辑我的答案 你不能在它上面使用附加,它本身就是一个数组,所以你可以用'+'添加它。我也编辑了,

以上是关于将对象附加到变量的主要内容,如果未能解决你的问题,请参考以下文章

如何将 gekko 对象插入/附加到现有列表/数组?

jQuery 在附加到 DOM 之前从元素中生成变量

JavaScript将属性附加到对象[重复]

JavaScript将属性附加到对象[重复]

将查询结果附加到现有的 json 对象

无法更改附加到游戏对象的脚本上的公共变量。值在播放时恢复