2016-12-14 6 views
0

내 UICollectionView가 cellForItemAt에있는 이미지를 가져 오는 중입니다. 스위프트 3으로 업그레이드 한 후에는 매우 빠르게 스크롤 할 때 일부 이미지가 표시되지 않습니다. 여기 cellForItemAt 내 코드입니다 : 심지어 화면에 전무로UICollectionView 이미지로드가 올바른 셀을 가져올 수 없습니다. 3

if (imageNotInCache) { 
    DispatchQueue.global(qos: DispatchQoS.QoSClass.default).async { 
    if let thumb = imageFromPathAndCacheIt(path) { 
     DispatchQueue.main.async { 
      let updateCell = collectionView.cellForItem(at: indexPath) as! MyCustomCell? { 
      updateCell.imageView.image = thumb 
      } 
    } 
} 

문제는가, 가끔은 updateCell를 얻을 수 (아마 스크롤 빨리하기 때문에).

이미지를 추가 한 후 reloadData을 추가 할 수 있습니다. Swift 3: Caching images in a collectionView과 같지만 재로드를 여러 번 호출하고 싶지는 않습니다.

이 질문에 관심을 가져 주셔서 감사합니다. 모든 아이디어는 매우 높이 평가 될 것입니다!

답변

1

셀보기 콘텐츠에 액세스하여 수동으로 업데이트하는 것과 사용자가 시도 할 수있는 전체 컬렉션보기에서 reloadData을 호출하는 것은 절충안입니다.

func reloadItems(at: [IndexPath])을 사용하면 화면에있는 경우 UICollectionView에 단일 셀을 다시로드하도록 요청할 수 있습니다.

아마도, imageNotInCache는 메모리 내 캐시에 image를 저장하고, 너무 오래 image 또한 func collectionView(UICollectionView, cellForItemAt: IndexPath)에 의해 접근로, 다음은 "그냥 작동"한다의 의미 : 답변

if (imageNotInCache) { 
    DispatchQueue.global(qos: DispatchQoS.QoSClass.default).async { 
     if let thumb = imageFromPathAndCacheIt(path) { 
      DispatchQueue.main.async { 
       self.collectionView.reloadItems(at: [indexPath]) 
      } 
     } 
    } 
} 
+0

감사합니다 ! 이렇게하면 모든 이미지를 올바른 셀에 표시 할 수 있습니다. 하지만 이제는 처음으로 스크롤되는 것이 움직이지 않게됩니다 ... 업데이트하기위한 올바른 셀을 얻는 방법이 있는지 궁금합니다. –

+0

걱정할 필요가 없습니다! 흠, 앱 작동 방식에 대해 잘 모른 채 잘 모르겠습니다! 인스 트루먼 테이션을 사용하여 스크롤하는 동안 주 스레드를 차단하는 요소를 정확하게 볼 수 있습니다. 만약 당신이 이것을하고 있지 않다면, 배경 스레드에'UIImage'를 단순히 만들면 이미지가 메모리로 디코드되지 않습니다. 이미지보기가 화면에 나타날 때 느리게 발생합니다. 이로 인해 대부분의 스크롤보기 지연이 발생할 수 있습니다. UIImage가 백그라운드에서 미리 해독되도록 명시 적으로 강제하는 방법에 관한 많은 질문이 있습니다. http://stackoverflow.com/questions/3904575/decode-images-in-background-thread – TiM

+0

스크롤 성능을 향상시키기 위해 일반적으로 할 수있는 최적화가 많이 있습니다. https://medium.com/ios-os-x-development/perfect-smooth-scrolling-in-uitableviews-fd609d5275a5#.t8tw7ojhp – TiM