2015-10-17 100 views
0

我想将对象追加到对象数组。将对象追加到变量

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对象,但是当我尝试添加到产品的变量,它不追加。

这里是输出:

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

第一线代表print(self.products),剩下的就是print(product)

谢谢

+0

您正在快速打印'self.products'。该行在异步请求完成之前很长时间执行。 – rmaddy

+0

@rmaddy我有另一个函数,它只返回这个数组中的项的总数,当我不追加自己时它总是返回0。 –

回答

2

“网络在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)) 
} 
+0

'self.products.append(product)'显示错误:'使用未解析的标识符产品'。我需要在Alamofire调用之前创建'product'变量吗? –

+0

噢,是的,否则它只在循环中声明。我会编辑我的答案 – Lukas

+0

你不能使用附加它btw,其数组本身,所以你可以添加'+'。我也编辑过, – Lukas