jinios / swift-storeapp

쇼핑몰 앱 - 코드스쿼드 미션 (2018.07 - 2018.08)
0 stars 0 forks source link

스토어 앱

완성화면

주요 기능

Step1 ~ Step7 완성화면

링크 - 단계별 완성화면

사용한 기술

사용한 라이브러리

공부한 부분 & Troubleshooting

데드락(Deadlock)

// TableViewCell에서 ImageSetter의 download가 호출

class func download(with url: String, handler: @escaping((Data) -> Void)) {
    let cacheURL = fileManager.urls(for: .cachesDirectory, in: .userDomainMask).first!
    let imageSavingPath = cacheURL.appendingPathComponent(URL(string: url)!.lastPathComponent)

    // 2. 아래 줄 코드의 existFile이 체크되고 handler가 실행됨
    if let imageData = existFile(at: imageSavingPath) {
        handler(imageData)
    } else {
        URLSession.shared.downloadTask(with: URL(string: url)!) { (tmpLocation, response, error) in
          // do something...
        }.resume()
    }
}

테이블뷰 업데이트 시 데이터 동기화

downloadTask() 동작방식

// 임시 파일 location으로 바로 이미지 가져와봄
func test() {
       let url = URL(string: "https://cdn.bmf.kr/_data/product/HCCFE/757878b14ee5a8d5af905c154fc38f01.jpg")!

       URLSession.shared.downloadTask(with: url) { (location, response, error) in
           if let error = error {
               print("\(error)")
           }
           if let location = location { // 파일이 저장된 url애 접근하여 UIImage생성
               let img = UIImage(contentsOfFile: location.path)
               DispatchQueue.main.sync {
                   self.view.addSubview(UIImageView(image: img))
               }
           }
       }.resume()
   }

캐시폴더로 파일 옮기기

  1. downloadTask의 컴플리션핸들러에서 받은 location은 tmpLocation
  2. tmp경로에서 cache path(imageSavingPath)로 move시
  3. imageSavingPath에 같은 이름이 있으면 moveError발생

해당 경로에 파일이 존재하는지 확인 후 Data생성

  do {
        try fileManager.moveItem(at: tmpLocation, to: imageSavingPath)
            let imageData = try? Data(contentsOf: imageSavingPath)
            handler(imageData)
    } catch {
        if FileManager().fileExists(atPath: imageSavingPath.path) {
            let imageData = try? Data(contentsOf: imageSavingPath)
            handler(imageData)
        } else { handler(nil) }