jinios / swift-storeapp

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

[Step8]Feedback from JK #24

Open jinios opened 6 years ago

jinios commented 6 years ago

스토어앱 마지막단계 피드백 정리

jinios commented 6 years ago

네트워크 에러처리

데이터를 다운받아서 상위모듈을 세팅할때

수정 전

private class func set(url: URL, handler: @escaping((ItemHashData)->Void)) {
URLSession.shared.dataTask(with: url) { (data, response, error) in
if let response = response as? HTTPURLResponse, response.statusCode == 200, let data = data {
do {
let parsedData = try JSONDecoder().decode(ItemHashData.self, from: data)
handler(parsedData)
} catch {
print("Parse Error!!!")
}
} else {
print("데이터 에러!")
}
}.resume()
}
  • JK: tryDownload() 나 set() 에서 Handler가 있는데 비정상적인 경우에는 print()만 하고 있네요. 상위 모듈로 handler를 통해서 전달해서 다음 상황에 대비할 수 있도록 처리해보세요.

수정 후

private class func set(url: URL, handler: @escaping((ItemHashData?)->Void)) {
        URLSession.shared.dataTask(with: url) { (data, response, error) in
            if let response = response as? HTTPURLResponse, response.statusCode == 200, let data = data {
                do {
                    let parsedData = try JSONDecoder().decode(ItemHashData.self, from: data)
                    handler(parsedData)
                } catch {
                    handler(nil)
                }
            } else {
                handler(nil)
            }
            }.resume()
    }
jinios commented 6 years ago

ViewController와 연결성 체크

ViewController에서 network status를 체크하거나 NetworkManager에서 noti를 받아서 처리하는 부분에 대한 코멘트

변경 전

// StoreViewController.swift
override func viewDidLoad() {
        ...
      // NetworkManager로부터 reachabilityChanged notification을 바로 받음
        NotificationCenter.default.addObserver(self, selector: #selector(dataReload), name: .reachabilityChanged, object: nil)
        NotificationCenter.default.addObserver(self, selector: #selector(setComplete(notification:)),name: .sectionSetComplete,object: nil)
        StoreItems.categories.forEach { (category) in
            self.storeItems.set(with: category)
        }
    }
// NetworkManager.shared.reachable을 가져와서 판단하여 처리
@objc func dataReload() {
        if NetworkManager.shared.reachable {
            StoreItems.categories.forEach { (category) in
                self.storeItems.set(with: category)
            }
        } else {
            print("RootView - dataReload. Not reachable")
        }
    }

// 마찬가지로 NetworkManager.shared.reachable를 판단하여 처리 
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        if NetworkManager.shared.reachable {
            self.runToast(indexPath: indexPath)

            if let nextVC = self.storyboard?.instantiateViewController(withIdentifier: "itemDetailView") as? ItemViewController {
                ...
                self.navigationController?.pushViewController(nextVC, animated: true)
            }
        } else {
            self.toUnreachableView()
        }
    }

변경 후



- **변경 후 흐름:**
  - reachabilityChanged notification: NeworkManager에서 네트워크 상태가 변경될때마다 post - Notification옵저버에 의해서 StoreItems 세팅되는 메소드 호출 - StoreItems가 세팅이 완료되면 ViewController에서 테이블뷰 reload