@@ -12,10 +12,10 @@ import Photos
1212protocol AlbumViewControllerDelegate : class {
1313 func albumViewController( _ albumViewController: AlbumViewController ,
1414 didInsertedItemAt indexPath: IndexPath ,
15- selectedImages: [ PickedImage ] )
15+ selectedImages: [ UIImage ] )
1616 func albumViewController( _ albumViewController: AlbumViewController ,
1717 didRemovedItemAt indexPath: IndexPath ,
18- selectedImages: [ PickedImage ] )
18+ selectedImages: [ UIImage ] )
1919}
2020
2121class AlbumViewController : UIViewController , Pageable {
@@ -34,11 +34,11 @@ class AlbumViewController: UIViewController, Pageable {
3434
3535 private var allAssets : PHFetchResult < PHAsset > ?
3636 private let maxSelectCount : Int
37- private var pickedImages = [ PickedImage ] ( )
37+ private var pickedImages = [ UIImage ] ( )
3838
3939 weak var delegate : AlbumViewControllerDelegate ?
4040
41- init ( columnCount: Int , maxSelectCount: Int , pickedImages: [ PickedImage ] ) {
41+ init ( columnCount: Int , maxSelectCount: Int , pickedImages: [ UIImage ] ) {
4242 self . columnCount = columnCount
4343 self . maxSelectCount = maxSelectCount
4444 self . pickedImages = pickedImages
@@ -63,13 +63,17 @@ extension AlbumViewController: UICollectionViewDataSource {
6363
6464 func collectionView( _ collectionView: UICollectionView , cellForItemAt indexPath: IndexPath ) -> UICollectionViewCell {
6565 guard let asset = allAssets? . object ( at: indexPath. item) else { fatalError ( ) }
66- let hasPicked = pickedImages. compactMap { $0. albumIndexPath } . contains ( indexPath)
67- if hasPicked {
68- collectionView. selectItem ( at: indexPath, animated: false , scrollPosition: [ ] )
69- }
7066 return SelectImageCollectionViewCell
7167 . dequeue ( from: collectionView, indexPath: indexPath)
72- . configure ( with: asset)
68+ . configure ( with: asset, completion: { [ weak self] image in
69+ guard let self = self , let image = image else { return }
70+ let hasPicked = self . pickedImages. contains ( where: { $0. isEqualData ( image) } )
71+ if hasPicked {
72+ self . collectionView. selectItem ( at: indexPath, animated: false , scrollPosition: [ ] )
73+ } else {
74+ self . collectionView. deselectItem ( at: indexPath, animated: false )
75+ }
76+ } )
7377 }
7478
7579}
@@ -82,18 +86,16 @@ extension AlbumViewController: UICollectionViewDelegate {
8286 func collectionView( _ collectionView: UICollectionView , didSelectItemAt indexPath: IndexPath ) {
8387 guard let cell = collectionView. cellForItem ( at: indexPath) as? SelectImageCollectionViewCell ,
8488 let image = cell. imageView. image else { return }
85- append ( pickedImage: PickedImage ( image: image,
86- albumIndexPath: indexPath) )
89+ append ( pickedImage: image)
8790 }
8891
8992 func collectionView( _ collectionView: UICollectionView , didDeselectItemAt indexPath: IndexPath ) {
9093 guard let cell = collectionView. cellForItem ( at: indexPath) as? SelectImageCollectionViewCell ,
9194 let image = cell. imageView. image else { return }
92- remove ( pickedImage: PickedImage ( image: image,
93- albumIndexPath: indexPath) )
95+ remove ( pickedImage: image)
9496 }
9597
96- func append( pickedImage: PickedImage ) {
98+ func append( pickedImage: UIImage ) {
9799 let insertIndexPath = IndexPath ( item: pickedImages. count, section: 0 )
98100
99101 pickedImages. insert ( pickedImage, at: insertIndexPath. item)
@@ -103,19 +105,26 @@ extension AlbumViewController: UICollectionViewDelegate {
103105 selectedImages: pickedImages)
104106 }
105107
106- func remove( pickedImage: PickedImage ) {
108+ func remove( pickedImage: UIImage ) {
107109 let removeIndexPaths = pickedImages
108110 . enumerated ( )
109- . filter { $0. element. albumIndexPath == pickedImage. albumIndexPath }
111+ . filter { $0. element. isEqualData ( pickedImage) }
110112 . map { IndexPath ( item: $0. offset, section: 0 ) }
111113
112114 guard let removeIndexPath = removeIndexPaths. first else { return }
113115
114- pickedImages. removeAll { $0. albumIndexPath == pickedImage. albumIndexPath }
116+ pickedImages. removeAll { $0. isEqualData ( pickedImage) }
115117
116- if let albumIndexPath = pickedImage. albumIndexPath,
117- collectionView. indexPathsForSelectedItems? . contains ( albumIndexPath) == true {
118- collectionView. deselectItem ( at: albumIndexPath, animated: true )
118+ let indexPath = collectionView. indexPathsForVisibleItems
119+ . enumerated ( )
120+ . first ( where: { ( offset, element) -> Bool in
121+ let cell = collectionView. cellForItem ( at: element) as? SelectImageCollectionViewCell
122+ let image = cell? . imageView. image
123+ return image? . isEqualData ( pickedImage) == true
124+ } ) ?
125+ . element
126+ if let indexPath = indexPath {
127+ collectionView. deselectItem ( at: indexPath, animated: true )
119128 }
120129
121130 delegate? . albumViewController ( self ,
@@ -145,7 +154,14 @@ extension AlbumViewController: PHPhotoLibraryChangeObserver {
145154 guard let fetchedResult = allAssets,
146155 let changeDetails = changeInstance. changeDetails ( for: fetchedResult) else { return }
147156 allAssets = changeDetails. fetchResultAfterChanges
148- reload ( for: changeDetails)
157+ reload ( )
158+ // reload(for: changeDetails)
159+ }
160+
161+ private func reload( ) {
162+ DispatchQueue . main. async {
163+ self . collectionView. reloadData ( )
164+ }
149165 }
150166
151167 private func reload( for changeDetails: PHFetchResultChangeDetails < PHAsset > ) {
@@ -168,3 +184,20 @@ extension AlbumViewController: PHPhotoLibraryChangeObserver {
168184 }
169185 }
170186}
187+
188+ extension UIImage {
189+ func isEqualData( _ image: UIImage ) -> Bool {
190+ if !image. size. equalTo ( self . size) {
191+ return false
192+ }
193+
194+ if let dataProvider1 = self . cgImage? . dataProvider,
195+ let dataProvider2 = image. cgImage? . dataProvider {
196+ if let data1 = dataProvider1. data,
197+ let data2 = dataProvider2. data {
198+ return data1 == data2
199+ }
200+ }
201+ return false
202+ }
203+ }
0 commit comments