Coder Social home page Coder Social logo

swift-storeapp's People

Contributors

godrm avatar jinios avatar

Watchers

 avatar

swift-storeapp's Issues

[Step6]Feedback from JK

네트워크 에러 처리

          URLSession.shared.downloadTask(with: URL(string: url)!) { (tmpLocation, response, error) in
                if let error = error {
                    print("Image download Error log: \(error)\n")
                }
                if let response = response as? HTTPURLResponse, response.statusCode == 200, let tmpLocation = tmpLocation {
                    do {
                        try fileManager.moveItem(at: tmpLocation, to: imageSavingPath)
                        if let imageData = try? Data(contentsOf: imageSavingPath) {
                            handler(imageData)
                        } else {
                            print("MOVE Error!")
                        }
                    } catch { print("MOVE Error!") }
                }
            }.resume()
        }
    }

피드백

  • JK : 여기 에러들은 로그 찍는거 말고 어떻게 할 수 있을까요? 네트워크는 항상 실패할 수 있기 때문에 대비를 해야합니다.
  • 나: 네트워크 에러인 경우에는 사용자에게 알려주고 refresh를 하거나 나중에 다시 시도해달라고 해야할 것 같습니다. 하지만 네트워크가 문제라면 refresh를 하더라도 이미지를 표시할 수는 없을것같습니다....!
    (모든 이미지를 앱에 저장해놓지 않는 이상 다른 방법이 있을까요? 🤔)
    하지만 적어도 사용자에게 문제가 있는걸 알려줘야한다고 생각합니다. 수정해보겠습니다! :)
  • JK : 맞아요 WiFi가 안되거나 여러 이미지가 실패하면 사용자에게 못 받았다고 알림창을 여러개 띄우는걸 말하는건 아니겠죠?
    네트워크에 접근하는 코드는 항상 실패를 확인해서 상위 모듈에 전달하는 구조가 있어야 해요.
    그게 return type 이든지 throw exception 이든지
    레벨2에서 exception을 메인으로 전달하던 기억을 떠올려보세요 :)

해결

  • 이미지데이터를 불러올 수 없는 상황(moveItem실패, 네트워크에러)시 refresh표시 이미지를 표시하도록 변경.

[쇼핑앱만들기 Step6] 병렬처리 요구사항

3개의 JSON 데이터가 모두 받고 나면 JSON 데이터에 포함된 이미지 URL을 분리해서 Image 파일들을 다운로드 받는다.
이미지 파일들을 병렬처리해서 한꺼번에 여러개를 다운로드하도록 구성한다.
(선택1) GCD Queue를 활용하거나
(선택2)Download Task 방식으로 구현한다.
다운로드가 완료되면 앱 디렉토리 중에 Cache 디렉토리에 URL에 있는 파일명으로 저장한다.
셀을 표기할 때 이미 다운로드된 이미지가 있으면 표시하고, 새로운 파일이 다운로드 완료되면 해당 이미지를 테이블뷰 셀에 뒤늦게(lazy) 표시한다.
화면에 표시할 때 다운로드를 담당하는 스레드와 화면을 처리하는 스레드를 위한 GCD Queue를 구분해서 처리한다.
이미지를 다 받을때 까지 화면이 하얗게 멈춰있지 않도록 만든다.

ScrollView에대한 커스텀 클래스 구현하기

setThumbnailScrollView() 나 setDetailScrollView() 에서 하는 작업은 결국 내부 뷰에 서브뷰를 추가하는 작업인데
이 부분을 ViewController에서 하지 않는다면 어떻게 분리할 수 있을까요?

제공된 URL로 JSON데이터를 받아서 StoreItem객체로 활용(URLSession사용)

  • 제공된 url로 JSON 데이터를 받아오는 모델 객체를 만든다.
  • HTTP 프로토콜 GET 요청으로 JSON 데이터를 받는다.
  • HTTP 요청은 URLSession 관련 프레임워크를 활용한다.
  • 응답으로 받은 JSON 데이터를 마찬가지 방법으로 Decode해서 StoreItem 객체로 변환한다.
  • 모델 객체는 응답이 도착하면 Notification을 보내서 테이블뷰의 해당 섹션만 업데이트한다.

상품목록 JSON파일 Decode하기

JSONDecoder를 활용해서 내부에 Array 타입으로 변환하는 DataSource에서 사용할 모델 객체를 만든다.

subscript로 배열에 index로 접근하면 StoreItem 구조체를 반환한다.
StoreItem은 Decodable 프로토콜을 채택하고, main.json에 있는 키와 값을 매핑해서 속성으로 갖도록 구현한다.
UITableViewDataSource 프로토콜 구현 부분에서 cell을 위에서 만든 DataSource 모델 객체에 접근해서 테이블뷰를 표시한다.

[Step3] Feedback from JK

// StoreItems.swift에서 전역변수로 사용
let CATEGORIES: [Category] = [.main, .soup, .side]
  • JK: 전역변수를 사용하기 보다는 StoreItems 같은 객체 네임스페이스를 활용해서 섹션에 대한 type 변수로 static 하게 설정해주는 게 어떨까요

  • 해결:

    • 원래는 StoreItems 구조체 내부에 static으로 구현했다가, 해당 변수에 접근하는 객체들이 많아서 전역변수로 변경함.
    • 하지만 이렇게 할 경우 해당 categories 변수가 어디 소속되어있는건지 알 수 없기때문에 객체 이름을 활용해서 구분 가능하도록 static 변수로 선언하는것이 좋다.
    • 또한 만약 다른 객체 내부에 동일한 용도의 변수가 생긴다면 (이번 애플리케이션 미션에서는 그럴리 없지만) 객체 이름으로 구별할 수 있게 된다.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.