Skip to content

3주차 그룹 피어세션(iOS)

Seungeon-Kim edited this page Nov 13, 2020 · 1 revision

피어세션 18 그룹

  • S050 정재명

  • S057 조정래

  • S063 현기엽

  • S010 김승언

우리의 앱

코드 구조

MVVM -> 테스트를 열심히 해보자!

class IssueListViewModel {
    struct Status {
        var issues =  Bindable(IssueListModel.all())
        var searchResultTitleList = Bindable([String]())
        var searchResultList = Bindable(IssueListModel.all())
        var filterResult = Bindable(IssueListModel.all())
    }
    
    struct Action {
        var searchTextChanged: (String) -> Void
        var searchButtonClicked: (String) -> Void
        var searchCancelButtonClicked: () -> Void
        var closeButtonTabbed: (Int) -> Void
        var deleteButtonTabbed: (Int) -> Void
        var refreshData: () -> Void
        var addIssueTabbed: (Int?, String, String) -> Void
        var issueFilter: ([Int]) -> Void
    }
}

    func test_Login_입력아이디가_6자미만이면_유효하지않다() throws {
        
        let id = "12345"
        let viewModel = SignInViewModel()
        
        viewModel.status.buttonEnabled.bind({ idCheck, passwordCheck in
            XCTAssertFalse(idCheck)
        })
        
        viewModel.action.idTextFieldChanged(id)
    }
    

NetworkLayer

func fetchLabels(completion handler: @escaping (Result<Labels, AFError>) -> Void) {
        guard let url = URL(string: baseURL + Endpoint.label.rawValue),
              let token = PersistenceManager.shared.load(forKey: .token) else {
            return
        }
        
        let headers: HTTPHeaders = [.authorization(bearerToken: token)]
        
        AF.request(url,
                   method: .get,
                   headers: headers)
            .validate()
            .responseDecodable(of: Labels.self) { response in
                handler(response.result)
        }
}

DispatchGroup

let dispatchGroup = DispatchGroup()

dispatchGroup.enter() 
function call()

dispatchGroup.leave()

dispatchGroup.notify(queue: DispatchQueue.main) {
    function callback()
}

Coordinator

protocol Coordinator: class {
    var finishDelegate: CoordinatorFinishDelegate? { get set }
    var navigationController: UINavigationController { get set }
    var childCoordinators: [Coordinator] { get set }
    var type: CoordinatorType { get }
    func start()
    func finish()
    
    init(_ navigationController: UINavigationController)
}

extension Coordinator {
    func finish() {
        childCoordinators.removeAll()
        finishDelegate?.coordinatorDidFinish(childCoordinator: self)
    }
}


protocol CoordinatorFinishDelegate: class {
    func coordinatorDidFinish(childCoordinator: Coordinator)
}

enum CoordinatorType {
    case jrm, tab, signIn, signUp, issueList, labelList, milestoneList
}

팀워크

  • 허심탄회하게 Go..! <- 진실게임

디스패치 그룹

reusable cell

  • prepareForUse()
    • 셀을 재사용하기 전에 프로퍼티를 초기화 해주어야 했다....!

URL - 한글

guard let url = (issueAPIURL + "\(oldName)").addingPercentEncoding(
                withAllowedCharacters: .urlQueryAllowed) else { return }
// parameter가 배열일 때, encoder
let encoder = URLEncodedFormParameterEncoder(encoder: URLEncodedFormEncoder(arrayEncoding: .noBrackets))

배열 parameter -> 여기에 대한 키가 이상해짐

  • 웹에서 파싱을 한 번 더 해줘야 또는 인코딩을 해줘야
  • Alamofire 문제

참고 자료