Bibi's DevLog ๐ค๐
PhotoKit ๊ทธ๋ฆฌ๊ณ Photos์ ํด๋์ค๋ค ๋ณธ๋ฌธ
PhotoKit ๊ทธ๋ฆฌ๊ณ Photos์ ํด๋์ค๋ค
๋น๋น bibi 2022. 3. 24. 11:37PhotoKit ๊ทธ๋ฆฌ๊ณ Photos์ ํด๋์ค๋ค
https://zeddios.tistory.com/614 ๊ณผ ๊ทธ ์๋ฆฌ์ฆ๋ค
Assets, Collections of Assets, List of Collections
๊ณตํต์ : read-only, immutable, ๋ฉํ๋ฐ์ดํฐ๋ง ํฌํจ
- Assets : ์ฌ์ง, ๋น๋์ค, ๋ผ์ด๋ธ ํฌํ
- Collections of Assets : ์จ๋ฒ ๋๋ Moments
- List of Collections : ์จ๋ฒ ํด๋ ๋๋ Moment ํด๋ฌ์คํฐ
PhotoKit
: Photos ํ๋ ์์ํฌ์ PhotosUI ํ๋ ์์ํฌ๋ฅผ ๊ฐ์ง๊ณ ์๋ ํ๋ ์์ํฌ.
์ฌ์ง ์ฑ์์ ์ฌ์ฉ์์๊ฒ ํ์๋๋ ๊ฐ์ฒด๋ฅผ ๋ชจ๋ธ๋งํ๋ ์ํฐํฐ ๊ทธ๋ํ๋ฅผ ์ ์ํ๋ค - lightweight, immutable
- ์ฌ์ง ์ฑ์ ์ฌ์ง๋ค, ๋น๋์ค๋ค, ์จ๋ฒ์ ์ ๊ทผํด ํด๋น assets๋ฅผ ๊ฐ์ ธ์ฌ ์ ์๊ฒ ํด์ค๋ค.
- ์ฌ์ง ์ฑ์ ์ฌ์ง ํธ์ง ํ์ฅ ๊ธฐ๋ฅ ์ง์
- ํ์ ๋ฐ ์ฌ์์ ์ํด, ์ฌ์ง ์ฑ์ ์ฌ์ง ๋ฐ ๋์์ assets์ ์ง์ ์ ๊ทผ ๋ฐ ์บ์ฑ ๊ฐ๋ฅ
PHObject
: Photo ๋ชจ๋ธ ๊ฐ์ฒด (assets์ collections)์ ์์ ์ถ์ ํด๋์ค.
๋ชจ๋ PhotoKit ๊ฐ์ฒด๋ PHObject๋ผ๋ ๊ธฐ๋ณธ ํด๋์ค์์ ์์๋๋ค.
- ์ด ํด๋์ค ์ธ์คํด์ค๋ฅผ ์ง์ ๋ง๋ค๊ฑฐ๋ ์ฌ์ฉํด์๋ ์ ๋๋ค. ๊ตฌ์ฒด์ ์ธ ํ์ํด๋์ค์ธ PHAsset, PHAssetCollection, PHCollectionList, PHObjectPlaceHolder์ ์ธ์คํด์ค๋ก ์์ ํด์ผ ํ๋ค.
- isEqual(_:) ๋ฐ ํด์ ๋ฉ์๋
- localIdentifier ํ๋กํผํฐ์ ๋ฐ๋ผ ๊ตฌํ
- asset ๋ฐ collection ๊ฐ์ฒด๋ฅผ ์ถ์ ํ ์ ์์
PHAsset : PHObject
: Photo Library์ ์๋ ์ด๋ฏธ์ง, ๋น๋์ค, ๋ผ์ด๋ธ ํฌํ ์ ๋ํ ํ์.
์ฌ์ฉ์์ ์ฌ์ง ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์๋ "ํ๋"์ asset(์ด๋ฏธ์ง/๋น๋์ค/๋ผ์ด๋ธ ํฌํ )์ ๋ํ๋ด๋ฉฐ, ํด๋น asset์ ๋ฉํ๋ฐ์ดํฐ๋ฅผ ์ ๊ณตํ๋ค.
- PHObject์ ํ์ ํด๋์ค
- Asset๋ฅผ ๊ฐ์ ธ์ ์์ ์ ์์ํ ์ ์๋ค - ํด๋์ค ๋ฉ์๋ ๋๋ PHAsset์ธ์คํด์ค๋ฅผ ๊ฐ์ ธ์จ๋ค.
- Asset์ metadata๋ง ํฌํจํ๋ค.
- Photos ํ๋ ์์ํฌ๋ ๊ฐ asset์ ์ธ๋ค์ผ์ ๋ค์ด๋ก๋ํ ์ ์๋ค - PHImageManager ์ฐธ๊ณ
- Asset ๊ฐ์ฒด๋ immutableํ๋ค - Asset์ ๋ฉํ๋ฐ์ดํฐ๋ฅผ ํธ์งํ๋ ค๋ฉด, PHAssetChangeRequest(๋ณ๊ฒฝ ์์ฒญ ๊ฐ์ฒด) ๊ฐ์ฒด๋ฅผ ๋ง๋ค์ด ๊ทธ ์์ฒญ๋๋ก ์ ๋ฐ์ดํธํด์ผ ํ๋ค. - PHPhotoLibrary ์ฐธ๊ณ
- fetch ๋ฉ์๋๋ค๋ก ์ฌ์ง ์ฑ์ ์ด๋ฏธ์ง๋ค์ ๋ถ๋ฌ์ฌ ์ ์๋ค.
PHAsset.fetchAssets()
: ๋ชจ๋ ์ฌ์ง์ ๋ฉํ๋ฐ์ดํฐ ์ ๋ณด๋ฅผ ๋ถ๋ฌ์ด
PHCollection
: Photo Asset Collection๊ณผ Collection List๋ฅผ ์ํ ์์ ์ถ์ํด๋์ค.
- PHObject์ ๊ฐ์ด, PHCollection์ ์ธ์คํด์ค๋ฅผ ์ง์ ๋ง๋ค๊ฑฐ๋ ์ง์ ์์
ํด์๋ ์ ๋๋ค.
- ๋์ PHAssetCollection ์ด๋ PHCollectionList๋ผ๋ ํ์ ๋ฆฌ์คํธ ์ค ํ๋๋ฅผ ์ฌ์ฉํด์ผ ํ๋ค.
โผ๏ธ ์ฌ์ง ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์ ๊ทผ/์์ ํ๋ ค๋ฉด ์ฌ์ฉ์์ ๋ช ์์ ์ธ ์น์ธ์ด ํ์ํ๋ค. Fetching Collections ์ ๋ฉ์๋ ์ค ํ๋๋ฅผ ํธ์ถํ๋ฉด ์ฌ์ง ์ฑ์ด ์๋์ผ๋ก ์ฌ์ฉ์์๊ฒ ์น์ธ ์์ฒญ ๋ฉ์์ง๋ฅผ ํ์ํ๋ค. (๋๋ PHPhotoLibrary.requestAuthorization(_:) ๋ฉ์๋๋ก ์ํ๋ ์๊ฐ์ ์ฌ์ฉ์์๊ฒ ๋ฉ์์ง๋ฅผ ๋ณด๋ผ ์ ์๋ค.)
์ฑ์ info.plist ํ์ผ์์, ์ฑ์ด ์ฌ์ง ์ ๊ทผ์ ์์ฒญํ๋ ์ด์ ๋ฅผ ์ฌ์ฉ์์๊ฒ ์ค๋ช ํ๋ NSPhotoLibraryUsageDescription ๊ฐ์ ์ ๊ณตํด์ผ ํ๋ค. ๊ทธ๋ ์ง ์์ผ๋ฉด iOS 10.0+ ์ ์ฐ๊ฒฐ๋ ์ฑ์ด ์ค๋จ๋๋ค
PHAssetCollection : PHCollection
: ์ฌ์ฉ์ ์ ์ ์จ๋ฒ, ์ค๋งํธ ์จ๋ฒ, Moment์ ๊ฐ์ Photo Asset ๊ทธ๋ฃน์ ํ์.
(์ฌ์ง ๋๋ ๋น๋์ค Asset์ collection)
PHAsset์ Collection์ด๋ฉฐ, PHCollection์ ํ์ ํด๋์ค์ด๋ค.
- ํ๋์ Asset Collection์ ์ฌ์ง ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์จ๋ฒ์ด๋, moment์ด๋, ์ค๋งํธ ์จ๋ฒ ์ค ํ๋์ด๋ค.
- asset collections์ ๋ฉค๋ฒ๋ฅผ ๊ฒ์ํ๋ ค๋ฉด fetchAssets (: options :)์ ๊ฐ์ PHAssetํด๋์ค ๋ฉ์๋๋ฅผ ์ฌ์ฉํ๋ค.
- asset collections์ ์ฐพ์ผ๋ ค๋ฉด Fetching Asset Collections์ ๋์ด๋ ๋ฉ์๋ ์ค ํ๋๋ฅผ ์ฌ์ฉํด์ผ ํ๋ค.
- PHAsset๊ณผ ๋ง์ฐฌ๊ฐ์ง๋ก PHAssetCollection๋ immutable ํ๋ค -
PHAssetCollectionChangeRequest
๊ฐ์ฒด๋ฅผ ๋ง๋ค์ด ์์ฑ/๋ณ๊ฒฝ/์ญ์ ์์ฒญ์ ํด์ผ ํ๋ค.- ์์ธํ ๋ด์ฉ์ PHPhotoLibrary ์ฐธ๊ณ .
PHCollectionList : PHCollection
: Photo Asset Collection์ ๋ด๊ณ ์๋ ๊ทธ๋ฃน.
- PHAssetCollection์ ๋ชจ์์ด๋ผ๊ณ ๋ณด๋ฉด ๋๋ค.
- ์ญ์ immutable ํ๋ฏ๋ก ์์ฑ/๋ณ๊ฒฝ/์ญ์ ์์
์ ์ํด์๋
PHCollectionListChangeRequest
๊ฐ์ฒด๋ฅผ ๋ง๋ค์ด์ผ ํ๋ค.- ์์ธํ ๋ด์ฉ์ PHPhotoLibrary๋ฅผ ์ฐธ๊ณ .
PHPhotoLibrary : NSObject
: ์ฌ์ฉ์์ ๊ณต์ ์ฌ์ง ๋ผ์ด๋ธ๋ฌ๋ฆฌ(shared photo library)์ ๋ํ ์ ๊ทผ ๋ฐ ๋ณ๊ฒฝ์ ๊ด๋ฆฌํ๋ ๊ณต์ ๊ฐ์ฒด(shared object).
- shared PHPhotoLibrary ๊ฐ์ฒด๋ ์ฌ์ง ์ฑ์์ ๊ด๋ฆฌํ๋ ์ ์ฒด Asset ๋ฐ Collection ์งํฉ์ ๋ํ๋ธ๋ค.
- ์ด ๊ฐ์ฒด๋ ๋ค์ ์์
์ ์ฌ์ฉ๋๋ค:
- ์ฑ์ด ์ฌ์ง ์ปจํ ์ธ ์ ์ ๊ทผํ ์ ์๋ ์ฌ์ฉ์ ๊ถํ์ ๊ฒ์ ๋๋ ํ์ธ
- Asset ๋ฐ Collection์ ๋ณ๊ฒฝํจ - asset ๋ฉํํ ์ดํฐ ๋๋ ์ปจํ ์ธ ํธ์ง, ์ asset ์ฝ์ , collection ์์ ์ฌ๋ฐฐ์น...
- ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋ณ๊ฒฝ๋ ๋ ์์คํ ์ด ๋ณด๋ด๋ ์ ๋ฐ์ดํธ ๋ฉ์์ง ๋ฑ๋ก
PHFetchResult : NSObject
: Photos fetch ๋ฉ์๋์ ์ํด ๋ฐํ๋ Assets ๋๋ Collections์ ์ ๋ ฌ๋ ๋ฆฌ์คํธ.
์ฌ์ง ์ฑ์์ ์ฌ์ง ๋๋ ์จ๋ฒ์ ๊ฐ์ ธ์ค๋ฉด(fetch), ๊ทธ ๊ฒฐ๊ณผ๋ฌผ๋ค์ด PHFetchResult์ ๋ด๊ธด๋ค.
- ์ ๋ฐ์ดํธ๋ ์ปจํ ์ธ ๋ฅผ ๊ฐ์ ธ์ค๋ ค๋ฉด, shared PHPhotoLibrary ๊ฐ์ฒด์ change observer๋ฅผ ๋ฑ๋กํด์ผ ํ๋ค.
PHAsset, PHCollection, PHAssetCollection, PHCollectionList ๋ฑ์ ํด๋์ค ๋ฉ์๋๋ฅผ ์ฌ์ฉํด ๊ฐ์ฒด๋ฅผ ๊ฒ์ํ๋ฉด, Photos๋ ๊ฒฐ๊ณผ ๊ฐ์ฒด๋ฅผ fetch์ ๊ฒฐ๊ณผ๋ก ์ ๊ณตํฉ๋๋ค. Fetch Result์ ๋ด์ฉ์ NSArray์ ๊ฐ์ ๋ฉ์๋ ๋ฐ ์ปจ๋ฒค์ ์ ์ฌ์ฉํด ์ ๊ทผํ๋ค.
PHFetchResult ๊ฐ์ฒด๋ ํ์์ ๋ฐ๋ผ Photos ๋ผ์ด๋ธ๋ฌ๋ฆฌ์์ ๋ด์ฉ์ ๋์ ์ผ๋ก ๋ก๋ํ๋ฏ๋ก, ๋ง์ ์์ ๊ฒฐ๊ณผ๋ฅผ ์ฒ๋ฆฌํ ๋๋ ์ต์ ์ ์ฑ๋ฅ์ ์ ๊ณตํ๋ค.
Fetch result๋ ๋ด์ฉ์ ๋ํ thread-safeํ ์ ๊ทผ์ ์ ๊ณตํ๋ค. fetch ํ์ fetch count๋ ์ผ์ ํ๋ฉฐ, fetch result์ ๋ชจ๋ ๊ฐ์ฒด๋ ๋์ผํ localIdentifier๋ฅผ ์ ์งํ๋ค.
Fetch result๋ ์ปจํ ์ธ ๋ฅผ ์บ์ํ๊ณ , ๊ฐ์ฒด ํ ๋ฌถ์(batch)์ ๊ฐ์ฅ ์ต๊ทผ์ ์ก์ธ์คํ ์ธ๋ฑ์ค ์ฃผ์์ ์ ์งํ๋ค. batch ์ธ๋ถ์ ๊ฐ์ฒด๋ ๋ ์ด์ ์บ์๋์ง ์์ผ๋ฉฐ, ์ ๊ทผํ๋ฉด ํด๋น ๊ฐ์ฒด๋ฅผ ๋ค์ ๊ฐ์ ธ์จ๋ค. ์ด ๋ ํด๋น ๊ฐ์ฒด์์ ์ด์ ์ ์ฝ์ ๊ฐ์ด ๋ณ๊ฒฝ๋ ์ ์๋ค.
PHFetchOptions : NSObject
: Asset๋ collection ๊ฐ์ฒด๋ฅผ fetchํ ๋ Photos๊ฐ ๋ฐํํ๋ ๊ฒฐ๊ณผ(result)์ ํํฐ๋ง, ์ ๋ ฌ, ๊ด๋ฆฌ์ ์ํฅ์ ์ฃผ๋ ์ต์ ์ ์งํฉ.
- PHAsset, PHCollection, PHAssetCollection ๋ฐ PHCollectionList ํด๋์ค์์ ํด๋์ค ๋ฉ์๋๋ฅผ ์ฌ์ฉํ์ฌ assets ๋๋ collection์ fetchํ๋ฉด, ์์ฒญํ ๊ฐ์ฒด๊ฐ ํฌํจ๋ PHFetchResult๊ฐ์ฒด๊ฐ ์์ฑ๋ฉ๋๋ค. ์ง์ ํ ์ต์ ์ ๋ฐ๋ผ fetch result์ ํฌํจ๋ ๊ฐ์ฒด, ์ ๋ ฌ๋ฐฉ๋ฒ, fetch result์ ๋ณ๊ฒฝ์ฌํญ์ ์ฑ์ ์๋ฆฌ๋ ๋ฐฉ๋ฒ์ ์ ์ด ํ ์ ์์ต๋๋ค.
- Photos๋ ์ ํ๋ key set์ ์ ๊ณตํ๋ฉฐ, ํด๋์ค์ ๋ฐ๋ผ ์ฌ์ฉ ๊ฐ๋ฅํ key set๊ฐ ๋ค๋ฅด๋ค - ๊ณต์๋ฌธ์ ์ฐธ๊ณ .
PHAsset์ ๊ทธ ์์ฒด๋ก ์ด๋ฏธ์ง๋ฅผ ๊ฐ๋ ๊ฒ ์๋ ๋ฉํ๋ฐ์ดํฐ์ผ ๋ฟ์ด๋ฏ๋ก, Image Manager์๊ฒ PHAsset๊ณผ ํ๋ผ๋ฏธํฐ๋ฅผ ๋๊ฒจ ์ค์ ์ด๋ฏธ์ง๋ฅผ ์์ฒญํด์ผ ํ๋ค.
Image Manager๋ PHImageManager, PHCachingImageManger์ 2 ์ข ๋ฅ๊ฐ ์๋ค.
PHImageManager : NSObject
: ๋ฏธ๋ฆฌ๋ณด๊ธฐ ์ธ๋ค์ผ๊ณผ Asset ๋ฐ์ดํฐ ๊ฒ์ ๋ฐ ์์ฑ์ ์ฉ์ดํ๊ฒ ํด ์ฃผ๋ ๊ฐ์ฒด.
๊ธฐ๋ฅ
- full-size ์ฌ์ง Asset,
- ์ธ๋ค์ผ ์ด๋ฏธ์ง,
- ๋น๋์ค Asset์ ์ฌ์/์ ์กํ๊ธฐ ์ํ AVFoundation ๊ฐ์ฒด ๋ฅผ ๊ฐ์ ธ์ค๊ธฐ ์ํด ์ฌ์ฉ ๊ฐ๋ฅํ ๋ฉ์๋๋ฅผ ์ ๊ณต.
์ฌ์ฉ๋ฒ
์ฌ์ง / ๋น๋์ค ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๋ ค๋ฉด
- PHAsset ํด๋์ค๋ก ๊ด์ฌ ์๋ Asset ๊ฐ์ ธ์ค๊ธฐ
- default() ํธ์ถํด shared image manager ๊ฐ์ฒด ๊ฒ์
- Asset์ ์ฌ์ง/๋น๋์ค ๋ฐ์ดํฐ ๋ก๋๋ฅผ ์ํด, Requesting Images ๋ฐ Requesting Video Objects์ ๋ฉ์๋ ์ค ํ๋๋ฅผ ์ฌ์ฉํ๊ธฐ
- PHImageManager๋ ์ ๊ณตํ๋ asset ์ด๋ฏธ์ง์ ๋ฐ์ดํฐ๋ฅผ ์บ์ํ๋ค.
- ์ ์ฌํ ๋งค๊ฐ๋ณ์๋ฅผ ์ฌ์ฉํ๋ ๋์ผ asset์ ๋ํด ๋ค์ ์์ฒญํ๋ฉด ๊ฒฐ๊ณผ๋ฅผ ๋ ๋นจ๋ฆฌ ๋ฐํํจ
- ์ฌ๋ฌ asset์ ์ด๋ฏธ์ง ๋ฐ์ดํฐ๋ฅผ ํจ๊ป ๋ก๋ํด์ผ ํ๋ ๊ฒฝ์ฐ, PHCachingImageManager๋ฅผ ์ฌ์ฉํด ํ์ํ ์ด๋ฏธ์ง๋ฅผ ๋ก๋ํ์ฌ ์บ์๋ฅผ ์ค๋นํด๋ผ.
PHCachingImageManager : PHImageManager
: ๋ฏธ๋ฆฌ๋ณด๊ธฐ ์ธ๋ค์ผ์ ๊ฒ์ ๋๋ ์์ฑ์ ์ฉ์ดํ๊ฒ ํ๋ฉฐ, ๋ง์ ์์ Asset์ ์ฌ์ ์ ์ผ๊ด ๋ก๋ํ๋ ๋ฐ ์ต์ ํ๋์ด ์๋ ๊ฐ์ฒด.
- ๋ง์ Asset ์์
์ ํ ๋์ ๋น ๋ฅธ ์ฑ๋ฅ์ ์ํด, ์ถํ ๊ฐ๋ณ ์ด๋ฏธ์ง๋ฅผ ์์ฒญํ ๋ ์ง์ฐ๋์ง ์๊ฒ ํ๊ธฐ ์ํด asset image๋ฅผ ๋ฐฑ๊ทธ๋ผ์ด๋์์ ์ค๋นํ ์ ์๋ค.
- ์๋ฅผ ๋ค์ด ์ฌ์ง/๋น๋์ค asset์ ์ธ๋ค์ผ๋ก collectionView ๋ฑ์ UI๋ฅผ ์ฑ์ฐ๊ธฐ ์ํด ์ฌ์ฉ ๊ฐ๋ฅ.
- PHCachingImageManager์ ์ฃผ์ ๊ธฐ๋ฅ์, ๋๋ถ๋ถ ์์ ํด๋์ค์ธ PHImageManager์ ์ํด ์ ์๋์ด ์๋ค.
์ฌ์ฉ๋ฒ
- PHCachingImageManager์ธ์คํด์ค๋ฅผ ๋ง๋ญ๋๋ค.
- PHAssetํด๋์ค ๋ฉ์๋๋ฅผ ์ฌ์ฉํ์ฌ ๊ด์ฌ์๋ asset์ ๊ฐ์ ธ์ต๋๋ค.
- asset์ ๋ํ ์ด๋ฏธ์ง๋ฅผ ์ค๋นํ๋ ค๋ฉด, ์ถํ ๊ฐ๋ณ asset์ ๋ํ ์ด๋ฏธ์ง๋ฅผ ์์ฒญ ํ ๋ ์ฌ์ฉ ํ target size, content mode ๋ฐ ์ต์
๊ณผ ํจ๊ป
startCachingImages(for:targetSize:contentMode:options:)
๋ฉ์๋๋ฅผ ํธ์ถํ์ธ์. - ๊ฐ๋ณ asset์ ๋ํ ์ด๋ฏธ์ง๊ฐ ํ์ํ ๊ฒฝ์ฐ
requestImage(for:targetSize:contentMode:options:resultHandler:)
๋ฉ์๋๋ฅผ ํธ์ถํ๊ณ , ํด๋น asset์ ์ค๋นํ ๋ ์ฌ์ฉํ ๊ฒ๊ณผ ๋์ผํ ๋งค๊ฐ๋ณ์๋ฅผ ์ ๋ฌํฉ๋๋ค. - ์์ฒญํ ์ด๋ฏธ์ง๊ฐ ์ด๋ฏธ ์ค๋น๋ ์ด๋ฏธ์ง ์ค ํ๋์ธ ๊ฒฝ์ฐ, PHCachingImageManager๊ฐ์ฒด๋ ํด๋น ์ด๋ฏธ์ง๋ฅผ ์ฆ์ ๋ฐํํฉ๋๋ค. ๊ทธ๋ ์ง ์์ผ๋ฉด Photos๊ฐ ํ์์ ๋ฐ๋ผ ์ด๋ฏธ์ง๋ฅผ ์ค๋นํ๊ณ , ๋์ค์ ์ฌ์ฉํ๊ธฐ ์ํด ์บ์ฑํฉ๋๋ค.
์ด์ธ์ startCachingImages
, stopCachingImages
๋ฑ์ ๋ฉ์๋๋ ์ ๊ณตํ๋ค.
์์ ์ฝ๋
:
import Photos
import UIKit
class PhotoManager: NSObject {
enum NotificationNames {
static let didChangePhotos = Notification.Name("PhotoManagerDidChangePhotos")
}
private var photos: PHFetchResult<PHAsset>
var count: Int {
return self.photos.count
}
override init() {
self.photos = PHAsset.fetchAssets(with: .image, options: nil)
super.init()
switch PHPhotoLibrary.authorizationStatus() {
case .authorized:
PHPhotoLibrary.shared().register(self)
default:
return
}
}
func makePhotoData(index: Int, size: CGSize) -> UIImage? {
let asset = self.photos.object(at: index)
var photo: UIImage?
PHCachingImageManager().requestImage(for: asset, targetSize: size, contentMode: .aspectFit, options: nil) { (image, _) in
photo = image
}
return photo
}
}
extension PhotoManager: PHPhotoLibraryChangeObserver {
func photoLibraryDidChange(_ changeInstance: PHChange) {
let previousPhotos = self.photos
let changedPhotos = changeInstance.changeDetails(for: previousPhotos)
self.photos = changedPhotos?.fetchResultAfterChanges ?? previousPhotos
NotificationCenter.default.post(name: NotificationNames.didChangePhotos, object: self)
}
}