2016-09-09 6 views
0

Ich habe versucht, eine Hintergrundbild-App zu erstellen, und mein Code funktionierte einwandfrei, als ich die gesamte Implementierung in der ViewController-Datei hatte. Und dann habe ich einen Teil des Codes in eine andere Klasse verschoben. Hier ist der Code.Wo sollte collectionView.ReloadData() aufgerufen werden?

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. 
    } 

} 

Wie lade ich die Daten im Viewcontroller? Ich habe versucht, einen collectionView-Parameter der getStuffFromJSON-Methode hinzufügen und collectionView.Reload am Ende aufrufen. Aber das funktioniert nicht. Auch bekomme ich 0 als previewURLArray.count in der numberOfItemsInSection Methode.

+0

Sie sollten einen Abschluss Schließung auf Ihrem 'getStuffFromJson' hinzuzufügen und das Array zurück zum Viewcontroller übergeben, dann gibt es im Innern Nachladen, ich sehe die 'downloadThumbnail' Sie tun es bereits, aber warum nicht für die andere tun? – Tj3n

+0

Es ist mir nicht einmal in den Sinn gekommen. Vielen Dank – 209135

+0

Was ist nicht aufgetreten? Übergeben Sie die TableView nicht an die Funktion, sondern schreiben Sie den Abschluss und lassen Sie den Code an ihn übergeben – Tj3n

Antwort

0

Versuchen Sie Bilder einstellen aus der dispatch_async und reloadData() Methode in die dispatch_async?

Ich habe grundlegende ähnliche App entwickelt, die mit Alamofire Pod funktioniert.

In download/fetch Funktion verwendet die Einstellungen arbeitet als später in einem Abfertigungs-Blocks die reloadData() meiner tableView

genannt Es gibt einen einzigen Unterschied, i mit tableView gearbeitet, Ihre App funktioniert mit collectionView

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

Ein kleiner Teil meiner App

// Benutzer Referenz

// Wörterbuch enthält json Daten

user.setValuesForKeysWithDictionary(dictionary); 

Tableview arbeitet mit Anwendern, String Array. Bevor die dispatch_async append Benutzer es dann reloadData() im

Dann

async rufen
self.users.append(user); 
dispatch_async(dispatch_get_main_queue(), { 
     self.tableView.reloadData(); 
}) 
Verwandte Themen