2016-09-09 8 views
0

Я пытался создать приложение для обоев, и мой код работал отлично, когда у меня была вся реализация в файле ViewController. И затем я переместил часть кода в другой класс. Вот код.Где должна быть вызвана коллекцияView.reloadData()?

ViewController.swift

override func viewDidLoad() { 
    super.viewDidLoad() 

    photoOperations.getStuffFromJson() 
} 



func collectionView(collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { 

    return photoOperations.previewUrlArray.count 

} 

func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell { 

    let cell = collectionView.dequeueReusableCellWithReuseIdentifier("Cell", forIndexPath: indexPath) as! CollectionViewCell 

    cell.backgroundColor = UIColor.whiteColor() 

    if let img = self.images[indexPath] { 

       cell.imageView.image = img 

      } else { 

       photoOperations.downloadThumbnail(indexPath.row){ (image) in 

        dispatch_async(dispatch_get_main_queue()) { 
         if let img = image { 

          cell.imageView.image = img 
          self.images[indexPath] = img 

         } else { 


          print("Images will be loaded in a few seconds!") 

         } 
        } 
        } 
        } 

    return cell 
} 

PhotoOperations.swift

func getStuffFromJson(){ 

    Alamofire.request(.GET, "https://example.com/api/", parameters: ["key": "123.."]) 
     .responseJSON{ response in 
      if let value = response.result.value { 

       let hits = JSON(value)["hits"] 
       var counter = 0 

       while counter < hits.count { 

        if let previewString = hits[counter]["previewURL"].rawString(){ 

         self.previewURL = NSURL(string: previewString)! 
         self.previewUrlArray.append(self.previewURL!) 
         counter += 1 


        } else{ print("Error : A previewURL wasn't found.") 
    }}}}} 



func downloadThumbnail(forIndexPathAtRow : Int , completion: (UIImage?)->Void) { 

    if previewUrlArray.count > 0 { 

     ... // create URL task , session etc. 
    } 

} 

Как перезагрузить данные в ViewController? Я попробовал добавить параметр collectionView к методу getStuffFromJSON и вызывать collectionView.reload в конце. Но это не работает. Также я получаю 0 как previewURLArray.count в методе numberOfItemsInSection.

+0

Вы должны добавить укупорочное завершения на вашем 'getStuffFromJson' и передать массив обратно в ViewController, то там внутри перезагрузите, я вижу 'downloadThumbnail', который вы уже делаете, но почему бы не сделать для другого? – Tj3n

+0

Мне это даже не приходило в голову. Большое спасибо – 209135

+0

Что не было? Не передавайте tableView в функцию, но завершайте закрытие записи и передавайте код vc pass – Tj3n

ответ

0

Вы пытались установить изображения из методов dispatch_async и reloadData() в dispatch_async?

Я разработал базовое аналогичное приложение, которое работает с Alamofire Pod.

В download/fetch функции используются параметры работы, чем позже в диспетчерский блок называется reloadData() моего tableView

Существует один разница, я работал с tableView, ваше приложение работает с collectionView

dispatch_async(dispatch_get_main_queue(), { 
      self.tableView.reloadData(); 
}) 

Небольшая часть моего приложения

// пользовательская ссылка

let user : User = User() 

// словарь содержит JSON Данные

user.setValuesForKeysWithDictionary(dictionary); 

Tableview работает с пользователями, String массив. Перед тем как пользователь dispatch_async Append к нему затем вызвать reloadData() в асинхронном

Тогда

self.users.append(user); 
dispatch_async(dispatch_get_main_queue(), { 
     self.tableView.reloadData(); 
})