2017-04-24 7 views
1

로드 후 축소판을 보여주는 CollectionView가 있습니다. 처음에는 그림이 장치에 저장되지 않으므로 서버에서 가져옵니다. 콜백 메소드에서 서버에서 이러한 이미지를 가져온 후 셀이 업데이트되지 않으면 스크린에서 스크롤해야합니다. 그런 다음 업데이트됩니다. 나는 다른 애플 리케이션에서 비슷한 메커니즘을 가지고, 거기에 모든 일을 잘하고 차이를 찾을 수 없습니다. 다음은 내가하는 일을 더 잘 이해할 수 있도록 코드의 일부입니다.UICollectionViewCell이 표시되면 이미지를 업데이트하지 않습니다.

이것은 미리보기 이미지가 서버에서 이미 가져온 것인지 확인한 후 이미지를 설정하는 코드입니다. 그렇다면 직접 설정하고 그렇지 않은 경우 Alamofire를 사용하여 그림을 검색하고로드가 끝난 후 업데이트하십시오.

override func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { 
    let cell = collectionView.dequeueReusableCell(withReuseIdentifier: self.reuseIdentifier, for: indexPath) as! PictureCollectionViewCell 

    /* Set thumbnail to the cell */ 
    if let thumbnail = pictures[indexPath.row].thumbnail { 
     cell.imageView.image = thumbnail 
    } else { 
     pictures[indexPath.row].retrievePicture(thumbnail: true, completion: { picture in 
      cell.imageView.image = picture 
     }) 
    } 

    return cell 
} 

앞에서 설명한 것처럼 보이는 화면 영역 밖으로 셀을 스크롤해야 업데이트됩니다. 셀 또는 collectionView 재로드가 문제를 해결하지 못했습니다. 어떤 아이디어?

미리 감사드립니다.

+0

클로저'retrievePicture()'가 호출 되었습니까? 그 코드는 무엇입니까? – Larme

+1

이미지가 다운로드 될 때까지 셀 표시가 완료됩니다. UI를 새로 고치려면 콜렉션 뷰에서'reloadData()'를 호출해야합니다. – lukya

+0

다운로드가 완료되면 어떤 스레드가 실행됩니까? – Fogmeister

답변

0

좋아들, 당신이 상상할 수있는 말 못하는 오류였다. 비동기 콜백 메서드에서 UI 업데이트 그냥 잘 작동합니다. 비동기 작업에서 콜백 메서드를 호출하는 것을 잊었습니다. 문제가 해결되었습니다. 도움을 주셔서 감사합니다.

4

블록이 백그라운드 스레드에서 실행되기 때문입니다. 메인 스레드에서 UI를 업데이트해야합니다. 콜백 있도록

collectionView.reloadItemsAtIndexPaths(yourIndexPath) 
+0

에 의해 업데이트됩니다. 동작을 변경하지 않았습니다. –

1

아래에이 코드를 찾을 수 사용 함수가 호출됩니다. 배경 스레드에서 UI를 업데이트 할 수 없습니다. 그래서 가져 오는 콜백이 같은 것을 사용하려고 :

DispatchQueue.main.async { 
    collectionView.reloadData() 
} 

또는

DispatchQueue.main.async { 
    collectionView.reloadItems(indexPaths) 
} 
+0

시도해 보았습니다. 전에도, 아무 일도 일어나지 않았어 –

1

가져 오기 아마 백그라운드 스레드에서 일어나는 : 더 잘 단순히 사용하는 대신 전체 테이블을 다시로드의 indexPath에서 항목을 다시로드

pictures[indexPath.row].retrievePicture(thumbnail: true, completion: { picture in 
      DispatchQueue.main.async { 
        cell.imageView.image = picture 
       } 
     }) 
+0

이전과 같은 동작, 아무 것도 변경되지 않았다. –