2015-10-17 7 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

"Networking в 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)' показать ошибку: «Использование продукта неразрешенных идентификаторов». Нужно ли мне создавать переменную 'product' перед вызовом Alamofire? –

+0

Oy да, иначе его объявили только в цикле. Я отредактирую свой ответ – Lukas

+0

, вы не можете использовать append на нем btw, его массив, чтобы вы могли просто добавить его с помощью «+». Я тоже редактировал это, – Lukas

Смежные вопросы