2017-07-26 1 views
0

Ich versuche folgende Methode, um Asset von lokalen Bezeichner abrufen und in der Sammlungsansicht anzeigen, aber scroll ruckartig beim Laden werden.Ich versuche, Asset von lokalen Bezeichner abzurufen und Bilder in CollectionView anzuzeigen, aber es macht Rollruck

func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { 

     let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "GridCell", for: indexPath) as! GridCell 

    cell.representedAssetIdentifier = "some uri" 

     let requestOptions = PHImageRequestOptions() 
     requestOptions.isSynchronous = false 
    let asset = PHAsset.fetchAssets(withLocalIdentifiers: ["some uri"!], options: .none).firstObject 

    imageManager.requestImage(for: asset!, targetSize: thumbnailSize, contentMode: .aspectFit, options: requestOptions, resultHandler: { result, info in 
     if cell.representedAssetIdentifier =="someuri" { 

      cell.imageview.image = result 

     } 
    }) 

Antwort

0

teure Operationen sollten nicht in der cellForItemAt Methode durchgeführt werden. Die Unterbrechungsrate liegt darin, dass das Scrollen verzögert wird, bis diese Methode abgeschlossen ist. Dies wird dazu führen, speziell durch die Linie:

let asset = PHAsset.fetchAssets(withLocalIdentifiers: ["some uri"!], options: .none).firstObject 

diese Zeile entfernen, und Sie werden das Scrollen sehen wie Butter glatt sein. Um dies zu beheben, müssen Sie klüger darüber sein, wo und wann diese Zeile ausgeführt wird, wenn sie wiederverwendbar ist, dann tun Sie sie einmal unter viewDidLoad und speichern Sie sie als Variable.

0

Der Aufruf PHAsset.fetchAssets(..) passiert synchron, was das Rendern der collectionView blockiert und das Scrollen stottert. Laden Sie Assets zum reibungslosen Scrollen immer asynchron, um den Hauptthread nicht zu blockieren.

Zum Laden von PHA-Sets schlagen Sie vor, die Klasse PHImageManager von Cocoa Touch zu betrachten.

Verwandte Themen