Ich habe eine UICollectionView
in der jede Zelle asynchron von Flickr bestückt ist.UICollectionView cellForItemAtIndexPath rief immer und immer wieder auf Scrollen
In meiner Szene möchte ich 21 Zellen, mein Code produziert das ganz gut. Mein Code ruft Flickr jedoch immer wieder auf, auch nachdem alle 21 Zellen in der cellForItemAtIndexPath
-Methode aufgefüllt wurden. Ich sehe mir die Apple-Dokumente an und habe nirgendwo gesehen, dass cellForItemAtIndexPath
ständig beim Scrollen aufgerufen werden sollte.
Ich mag jede Zelle nur einmal gefüllt werden und dann einmal abgeschlossen cellForItemAtIndexPath
soll nicht wieder aufgerufen werden.
Hier ist mein Code:
import UIKit
import MapKit
import CoreData
class ImagesCollectionViewController : UIViewController, UICollectionViewDataSource, UICollectionViewDelegate{
@IBOutlet weak var mapView: MKMapView!
@IBOutlet weak var collectionView: UICollectionView!
var mapLat : Double!
var mapLong : Double!
let flickrApi = Flickr()
var imageURLSet = [String]()
override func viewDidLoad() {
// set the location and zoom of the minimap
let clLocation = CLLocationCoordinate2D(latitude: mapLat, longitude: mapLong)
let span = MKCoordinateSpan(latitudeDelta: 2, longitudeDelta: 2)
mapView.setRegion(MKCoordinateRegion(center: clLocation, span: span), animated: false)
mapView.scrollEnabled = false
getImages()
}
func collectionView(collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
return imageURLSet.count
}
func numberOfSectionsInCollectionView(collectionView: UICollectionView) -> Int {
return 1
}
func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell {
print("test") // <--- this prints over and over again on scrolling
let cell = collectionView.dequeueReusableCellWithReuseIdentifier("ImageCell", forIndexPath: indexPath) as! FlickrImageCellViewController
let queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)
dispatch_async(queue) {() -> Void in
let url = NSURL(string: self.imageURLSet[indexPath.row])
let data = NSData(contentsOfURL: url!)
let img = UIImage(data: data!)
dispatch_async(dispatch_get_main_queue(), {
cell.imageView.image = img
})
}
// This is where the cells are being populated
return cell
}
//Get images from the flickr API and store in array
func getImages(){
let parameters : [String : AnyObject] = ["method": Flickr.Consts.GEO_METHOD, "format" : Flickr.Consts.FORMAT, "api_key": Flickr.Consts.API_KEY, "lat" : mapLat, "long" : mapLong, "nojsoncallback" : "1", "per_page" : "21", "extras" : "url_m"]
flickrApi.performGetRequest(parameters) { (data, error) in
for record in data as! [AnyObject]{
if(record["url_m"] != nil){
print("record")
print(record["url_m"] as! String)
print("end record")
self.imageURLSet.append(record["url_m"] as! String)
}
}
}
}
override func viewDidAppear(animated: Bool) {
self.collectionView.reloadData()
}
}
Die Sammlung Ansicht erzeugt nur so viele Zellen wie auf dem Bildschirm auf einmal passen und verwendet die Zellen, den Bildschirm gescrollt hat als neue zu kommen 'cellForItemAtIndexPath.' Wird jedes Mal, wenn eine Zelle auf dem Bildschirm kommt aufgerufen. – dan
Ich sehe nicht, wo Sie insertItemsAtIndexPaths in Ihrer Sammlungsansicht aufrufen. –