diff --git a/README.md b/README.md
index e84da7c..9089b25 100644
--- a/README.md
+++ b/README.md
@@ -1,20 +1,18 @@
# PhotosApp
-
+๐ท PhotoLibrary์ Web์ ์ด๋ฏธ์ง๋ฅผ Collection์ผ๋ก ๋ณด์ฌ์ฃผ๊ณ , Local ์ ์ฅ ๋ฑ์ ๊ธฐ๋ฅ์ ์ฐ์ตํ๋ ํ๋ก์ ํธ
๐ฑ Developer : Lollo ๐ฉ๐ปโ๐ป , ์ญ์จ ๐ง๐ปโ๐ป
-## Step 1 : Random Color CollectionView ์ ์
-
-#### 2021.03.22
+## Step 1 : Random Color CollectionView ์ ์ (3/22)
### ๊ตฌํ ๋ด์ฉ ๐ฑ
- ๋ฌด์์ ์์์ ๋ฐฐ๊ฒฝ์ ๊ฐ์ง 40๊ฐ์ cell์ ์์ฑํ๊ณ ์ธ๋ก ์คํฌ๋กค Collection์ ๋ํ๋๋ค.
-
+
@@ -53,16 +51,14 @@
-## Step 2 : CollectionView์ PhotoLibrary ํญ๋ชฉ ํ์
-
-#### 2021.03.23
+## Step 2 : CollectionView์ PhotoLibrary ํญ๋ชฉ ํ์ (3/23)
### ๊ตฌํ ๋ด์ฉ ๐ฑ
- PhotoLibrary์ ์ฝํ
์ธ ๋ชฉ๋ก์ ๋ถ๋ฌ์์ ํ์ํ๋๋ก ๊ตฌํ
- PhotoLibrary์ ๋ณํ๊ฐ ์๊ธธ ์ ์์ ์ฌํญ์ ๋ฐ์ํ์ฌ ๋ชฉ๋ก์ ์
๋ฐ์ดํธํ๋๋ก ๊ตฌํ
-
+
@@ -101,14 +97,10 @@
3. **`performBatchUpdates`๋ฅผ ํตํ `CollectionView` ์
๋ฐ์ดํธ**
- CollectionView๊ฐ ์ ๊ณตํ๋ **insert/delete/reload/move** ๊ธฐ๋ฅ์ ํตํด View๋ฅผ ํจ์จ์ ์ผ๋ก ์
๋ฐ์ดํธํ์๋ค.
+
+
----
-
-## Step 3-1 : JSONํ์ผ์์ Image๋ฅผ ControllerView์ ๋ณด์ฌ์ฃผ๊ธฐ
-
-
-
-#### 2021.03.24
+## Step 3-1 : JSON ํ์ฑ, Modal view ๋์ฐ๊ธฐ (3/24)
### ๊ตฌํ ๋ด์ฉ ๐ฑ
@@ -116,6 +108,8 @@
- Async๋ฐฉ์์ ์ด์ฉํ์ฌ ์ ๋ณด๋ฅผ ๊ฐ์ ธ์ฌ ๋๋ง๋ค View์์ ํด๋น ์ด๋ฏธ์ง๋ฅผ ๋ณด์ฌ์ค๋ค.
- ์ฝ๋๋ฅผ ์ด์ฉํ์ฌ + ๋ฒํผ์ ๋๋ ์ ๋ Modal๋ก DoodleView๋ฅผ ๋ณด์ฌ์ค๋ค.
+
+
### Today's ํ์ต๊ฑฐ๋ฆฌ ๐
@@ -246,24 +240,18 @@
-
-
-
-
-## Step 3-2 : ๋ค์ด๋ฐ์ Image๋ฅผ DoodlesView์์ ๋ณด์ฌ์ฃผ๊ธฐ
-
+## Step 3-2 : URL์ Image๋ฅผ Modal view์์ ๋ณด์ฌ์ฃผ๊ธฐ (3/25)
+### ๊ตฌํ ๋ด์ฉ ๐ฑ
-#### 2021.03.25
+- DoodleViews๋ฅผ StoryBoard ์ด์ฉ ์์ด Code๋ก ๊ตฌํ.
+- ์๋ก ๋ค๋ฅธ DispatchQueue๋ฅผ ์ด์ฉํ์ฌ ๋ค์ด๋ฐ๋ ํ์ ๋ณด์ฌ์ฃผ๋ ํ๋ฅผ Asyncํ๊ฒ ์์
-- ### ๊ตฌํ ๋ด์ฉ ๐ฑ
+
- - DoodleViews๋ฅผ StoryBoard ์ด์ฉ ์์ด Code๋ก ๊ตฌํ.
- - ์๋ก ๋ค๋ฅธ DispatchQueue๋ฅผ ์ด์ฉํ์ฌ ๋ค์ด๋ฐ๋ ํ์ ๋ณด์ฌ์ฃผ๋ ํ๋ฅผ Asyncํ๊ฒ ์์
-
- ### Today's ํ์ต๊ฑฐ๋ฆฌ ๐
+### Today's ํ์ต๊ฑฐ๋ฆฌ ๐
1. DoodleViews๋ฅผ StoryBoard ์ด์ฉ ์์ด DoodleViewsController์์ Code๋ก ๊ตฌํ
@@ -286,64 +274,44 @@
-2. `URL`์ ํตํ Images๋ฅผ ์ ์ฅํ๊ณ ์ ์ฅ๋ Images๋ฅผ View์ ๋ณด์ฌ์ฃผ๋ ์์
์ Asyncํ๊ฒ ๊ตฌํ
-
- - `ImageManager`๋ฅผ ํตํด ์ ๋ ์์
ํ JSONํ์ผ์ ํตํด ์์
ํ๋ ImageDownload ๊ทธ๋ฆฌ๊ณ , DownLoadํ ์ด๋ฏธ์ง๋ฅผ ์ฝ๋ ์
๋ทฐ์ ๋ณด์ฌ์ฃผ๋ ์์
์ ๊ณต๋ถํ์๋ค.
-
- - ๊ฐ๊ฐ์ ์ฃผ์์ ํด๋นํ๋ ์ด๋ฏธ์ง๋ฅผ ๋ค์ด๋ฐ๋ ํจ์
+2. ์์ JSON์์ ํ์ฑํ `URL`์์ ์น ์ด๋ฏธ์ง๋ฅผ ๋ถ๋ฌ์ฌ ๋, ๋ค์ค Queue ๋ฐ async ๋ฐฉ์์ ํ์ฉ (***2021.03.28 ์์ **)
- - ```swift
- private func startDownloading() {
- imageURLs.forEach { (url) in
- backGroundDownloadingQueue.async {
- self.downloader.downloadImage(imageURL: url, completionHandler: { (_) in },
- placeholderImage: UIImage())
- }
- }
- }
- ```
-
- - ๋ค์ด๋ฐ์ ์ด๋ฏธ์ง๋ฅผ ํด๋น Cell์ ์ ์กํ๋ ๋ฐฉ๋ฒ์ผ๋ก `Notification`์ ํ์ฉํ์ฌ ์ฆ๊ฐ์ ์ผ๋ก ๋ณด๋ด๊ฒ ํ์๋ค.
-
- - ```swift
- NotificationCenter.default.addObserver(self,
- selector: #selector(didImageDownloadDone(_:)),
- name: ImageManager.NotiKeys.imageDownloadDone,
- object: imgManager)
- ```
-
- - `DispatchQueue`์ ๋ํ `Asyn`์ ๊ณ ์ฐฐ
+
- - ์ผ๋ฐ์ ์ผ๋ก๋ ๊ฐ๊ฐ์ ์ฃผ์์ ํด๋นํ๋ ์ด๋ฏธ์ง๋ฅผ ๋ค์ด๋ฐ๋๋ก ํ๋ค. ํ์ง๋ง ๋ค์๊ณผ ๊ฐ์ ์ํฉ์ ๋๋น๋ฅผ ํด์ผํ๋ค.
+- 2๊ฐ์ง ๊ฒฝ๋ก๋ก ์ด๋ฏธ์ง๋ฅผ ๋ค์ด๋ก๋ํ๋๋ก ๊ตฌํํ์๋ค.
- - ๋ชจ๋ ๋ฐ์ดํฐ๊ฐ ๋ค์ด๋ฐ๊ธฐ ์ ๊น์ง ์ด๋ฏธ์ง ๋ทฐ๋ฅผ ๋ณด์ฌ์ฃผ๋ ํจ์๊ฐ ์คํ๋์ง ์๋๋ค.
- - ์ด๋ฏธ์ง๋ฅผ ๋ณด์ฌ์ฃผ๋ ๊ฒ์ด ์์ฐจ์ ์ด๋ผ ์คํฌ๋กค ๋ทฐ๋ฅผ ๋ด๋ ธ์ ๋ ๋์ค๋ ์
์ ๋ํ ์ด๋ฏธ์ง๊ฐ ์์ง ๋ณด์ฌ์ง์ง ์๋๋ค.
+ 1. **cell ์์ฑ ์์ ์ ๋ค์ด๋ก๋**
+ - `DataSource delegate`์ ๋ฉ์๋ `collectionView(cellForItemAt indexPath:)`๋ฅผ ํตํด ์คํฌ๋กค ์์น์ cell๋ค์ด ์์ฑ๋ ๋, ์์ง ํด๋น cell์ ์ด๋ฏธ์ง๊ฐ ๋ค์ด๋ก๋๋ ์ด๋ ฅ์ด ์๋ค๋ฉด download task๋ฅผ ์์ฑํ๊ณ , concurrent queue์ ์ถ๊ฐํ๋๋ก ํ๋ค.
+ - asyncํ๊ฒ ๋ค์ด๋ก๋ ํ, ์๋ฃ๋๋ฉด Notification์ ๋ณด๋ด๋๋ก ํ๋ค. Noti๋ฅผ ํตํด reload ์์ ์ ์๋ ค์ฃผ์ด ๋ค์ ์คํฌ๋กค์ ํ์ง ์๋๋ผ๋ ์ํํ ๋ก๋๊ฐ ๊ฐ๋ฅํ๋๋ก ํ๋ค.
+ - VC์์ Noti๋ฅผ ๋ฐ์ผ๋ฉด, `OperationQueue.main`์ cell์ reloadํ๋ task๋ฅผ ์ถ๊ฐํ๋๋ก ํ๋ค. ์ด๋ concurrent queue๋ฅผ ์ฌ์ฉํ๋ฉด view ํ์ ์ ๋ฐ๋ฆผ ํ์์ด ์ผ์ด๋๋ฏ๋ก serial queue๋ฅผ ์ฌ์ฉํ๋ค.
+ 2. **background์์ ๋ค์ด๋ก๋**
+ - `DoodleViewController`์ viewDidLoad ์์ ์ ImageManager์ ๋ฉ์๋ `startDownloadingAtBackground()`๋ฅผ ํตํด ๋ชจ๋ URL์ ์ด๋ฏธ์ง ๋ค์ด๋ก๋ task๋ฅผ concurrent queue์ ์ถ๊ฐํ๋๋ก ํ๋ค.
+ - cell ์์ฑ ์์๋ง ๋ค์ด๋ก๋๋ฅผ ์งํํ๋ฉด ์คํฌ๋กค ์ ์ด๋ฏธ์ง์ ์ํํ ์๊ธ์ ์ ์ฝ์ด ์๊ธฐ๋ฏ๋ก, ์์ง ๋๋ฌํ์ง ์์ indexpath์ ๋ํด์๋ ๋ฏธ๋ฆฌ ๋ค์ด๋ก๋๋ฅผ ์งํํ๊ณ ์บ์ฑํ์ฌ ์ ์ฅํด๋๋๋ก ํ๋ค.
- - ๋ฐ๋ผ์ ๋ชจ๋ ๋ทฐ๋ฅผ ์์ฐจ์ ์ผ๋ก ์ด๋ฏธ์ง๋ฅผ ๋ฐ๊ฒํ๊ณ , `dequeueReusableCell` ์ ํด๋นํ๋ ์๋ก์ด Cell์ด ๋ณด์ฌ์ฃผ์์ ๋๋ฅผ ๋๋นํ์ฌ ์ฆ๊ฐ์ ์ธ ์ด๋ฏธ์ง๋ฅผ ๋ณด์ฌ์ฃผ๋ ๊ฐ๊ฐ์ ์ฐ๋ ๋๋ฅผ ์์ฑํ์ฌ Asynํ๊ฒ ์์
ํ๋๋ก ํ์๋ค.
+- dictionary๋ฅผ ํ์ฉํ์ฌ ์ด๋ฏธ์ง๋ฅผ ์บ์ฑํ๊ณ , ์งํํ task ์ ๋ณด๋ฅผ ์ ์ฅํ๋๋ก ํ๋ค.
- - ```swift
- imageDownloadQueue = DispatchQueue.init(label: "imageDownload")
- backGroundDownloadingQueue = DispatchQueue.init(label: "backgroundImageDownload")
- ```
+ ```swift
+ class ImageDownloader {
+ private var cachedImages: [URL: UIImage]
+ private var imagesDownloadTasks: [URL: URLSessionDataTask]
+ ...
+ }
+ ```
-
+ - ์ด๋ฅผ ํตํด memory leaking์ ๋ฐฉ์งํ๊ณ , error๊ฐ ์๋ task๊ฐ ๋ฌดํํ ์งํ๋์ง ์๋๋ก ๋ง์ ์ ์์๋ค.
+ - ๊ทธ๋ฌ๋ dictionary.subscript.getter / setter ๋ฒ๊ทธ๊ฐ ์ข
์ข
๋ฐ์ํ๋ ๋ฌธ์ ๊ฐ ์์๋ค. ([Issue: dictionary.subscript.getter ๋ฌธ์ ](https://github.com/codesquad-members-2021/swift-photos-06/issues/13))
+ - dictionary๋ thread-freeํ์ง ์์์, ๋์ ์ ๊ทผ ์ ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์ ์๋ค๋ ๊ฒ์ ์๊ฒ ๋์๋ค. set ์์ `barrier`๋ฅผ ๊ฑธ๊ณ , get ์์ syncํ๊ฒ ์ฒ๋ฆฌํ๋ ๊ฒ์ผ๋ก issue๋ฅผ ํด๊ฒฐํ ์ ์์๋ค.
-
-
- ## Step 3-3 : Image๋ฅผ ์ ์ฅํ๊ธฐ
-
-
+## Step 3-3 : Image๋ฅผ PhotoLibrary์ ์ ์ฅํ๊ธฐ (3/26)
-#### 2021.03.26
-
- - ### ๊ตฌํ ๋ด์ฉ ๐ฑ
+### ๊ตฌํ ๋ด์ฉ ๐ฑ
- - Image๋ฅผ ๊ธธ๊ฒ ๋๋ฌ์ ์ ์ฅํ๊ธฐ.
- - ์ ์ฅ ์ ์๋ฆผ๋ฉ์์ง ๋์ค๊ธฐ ๋ฐ ์จ๋ฒ ๊ฐฑ์ .
+- Image๋ฅผ ๊ธธ๊ฒ ๋๋ฌ์ ์ ์ฅํ๊ธฐ.
+- ์ ์ฅ ์ ์๋ฆผ๋ฉ์์ง ๋์ค๊ธฐ ๋ฐ ์จ๋ฒ ๊ฐฑ์ .
-
+
### Today's ํ์ต๊ฑฐ๋ฆฌ ๐
@@ -363,8 +331,9 @@
2. `Save` Btn์ ์ด์ฉํ์ฌ ์ ์ฅํ ์, ์ ์ฅ์ด ๋์๋์ง๋ฅผ ์๋ ค์ฃผ๋ ๊ธฐ๋ฅ์ด ํ์ํ๋ค๊ณ ์๋
ผํ์๋ค.
- ์ด์ : DoodlesView์์ LocalAlbumView๊ฐ ์๋ก ๋ค๋ฅด๊ธฐ์ ์ค์ ๋ก ์ ์ฅ๋์๋์ง๋ View์ ํ์ ํตํด์๋ง ํ์ธ์ด ๊ฐ๋ฅ
- - **์ฌ์ฉ์ฑ ํธ์ ์ฆ์ง!!**
-
+
+ - **์ฌ์ฉ์ฑ ํธ์ ์ฆ์ง!!**
+
- `UIAlertController` ์ ์ด์ฉํ์ฌ ์ฌ์ฉ์์๊ฒ ์ ์ฅ ์๋ฃ ๋ผ์์์ ์๋ ค์ค
- ```swift
@@ -389,4 +358,3 @@
}
```
-