2017-01-12 4 views
0

У меня есть простой запрос Alamofire, и я разбираю его с SwiftyJSON. Вот код:Alamofire Добавление данных

var fetchedData: [TestDB]? = [] 

func fetchData() { 
    Alamofire.request(url!, method: .get).validate().responseJSON { response in 
     switch response.result { 
     case .success(let value): 
      let json = JSON(value) 

      self.fetchedData = [TestDB]() 

      for dict in json["articles"].array! { 

       let data = TestDB() 

       if let image = dict["urlToImage"].string { 
        data.imageUrls = image 
       } 

       if let titlee = dict["title"].string { 
        data.titlee = titlee 
       } 

       if let desc = dict["description"].string { 
        data.desc = desc 
       } 

       self.fetchedData?.append(data) 
       // If i print fetchedData here, i can see it has right values. 
       // print(fetchedData) 

      } 
     case .failure(let error): 
      print(error) 
     } 
    } 
     // If i try to print fetchedData here, it's empty. 
} 

Как я уже сказал в коде, я не могу добавить и использовать свои данные. Я думаю, что это что-то с Alamofire является асинхронным. Но не мог понять, почему. Любая помощь приветствуется. Благодаря!

+1

Вы сделали небольшую ошибку. Вы инициализируете self.fetchedData каждый раз в успешном блоке. Вот почему вы не можете добавлять данные. – sanman

+0

@sanman да, это была ошибка. Но фиксированный код по-прежнему имеет такую ​​же проблему. –

ответ

2

При использовании асинхронного метода у вас есть какой-нибудь способ, чтобы продолжить, например:

  • использование обратного вызова
  • использование RAC/наблюдение

Callback:

func fetchData(completion: (result: [TestDB]) ->) { 
    Alamofire.request(url!, method: .get).validate().responseJSON { response in 
     self.fetchedData = [TestDB]() 
     // fill self.fetchedData then: 
     completion(self.fetchedData) 
    } 
}) 

Где вы звоните: fetchData:

self.fetchData(completion: { 
    // update collectionview? 
    self.collectionView.reloadData() 
}) 

RAC:

Вы можете найти всю документацию here.

Plus:

Некоторые предложения:

  • self.fetchedData = TestDB не надо, наверное, достаточно self.fetchData.removeAll()

  • использование ObjectMappar на карте любой ответ json на объект