Todo앱 시리즈1 - Alamofire

라무·2023년 8월 9일

TodoApp 시리즈

목록 보기
1/3

반드시 구현해야 하는 부분

  • table view cell만들어서 cell 재활용하기
  • 할일 목록 가져와서 cell에 데이터 뿌려주기
  • 할일 추가하기
    • 할일 추가하기 부분에서 post로 데이터를 보내줘야 한다
    • post로 데이터를 보내주고 난 후에 success라면 popUp이 닫힌다
    • PopUp이 닫힌 후에 tableViewCell의 데이터로 추가한 데이터가 들어가 져야 한다
    • 할일 추가할 때 6글자이상 데이터가 입력되지 않았다면 아래 label로 6글자 이상 입력하라고 하고 팝업창 닫지 않기
      • 평소에는 hidden으로 화면상 안보이도록 하고 6글자가 안되면 label을 보이게 하기
  • 특정 할일 가져오기
  • 특정 할일 수정하기
  • 기존 할일 삭제하기
  • 페이지네이션 구현하기
    • 맨 아래에 스크롤이 내려오면 다음페이지에 해당하는 데이터를 불러오는 식으로 진행을 해야 한다
      1. 현재 y축의(세로의 스크롤)이 어디까지 내려와있는지 구한다
      2. 그리고 그 포지션이 특정 위치에 도달했을 때 데이터를 새로 받아오고 데이터를 새로 받아올 때 까지 스피너가 돌아간다
      3. 그리고 api를 가지고 오는 동안에는 다시 api를 가지고 오지는 못하도록 해야 한다 → 특정 변수를 둬서 그 변수를 통해서 제어를 한다

하면서 어려웠던 부분

  1. alamofire을 이용해서 get을 보내는 방식은 그냥 따로 method를 써줄 필요없고 바로 url만 적어주면 되서 살짝 헷갈렸다

  2. 데이터 파싱해서 데이터 리스트에 넣어주는 부분

    1. 데이터가 어떻게 이루어져 있는지 구분하기 힘들었다 → 배열로 되어있어서 처음에는 헷갈렸음

    2. 데이터를 Post로 보낼때 데이터들을 String, Boolean, Int등을 넣어야 하는데 어떻게 넣어야 할까?

      → 해결방법: [String: Any]를 사용한다!!!! → ㅋ,,,안된다

      → 해결방법2: struct 변수명: Encodable을 이용한다

      • 왜 이미 struct TodoData: Codable로 이미 정의되어잇는 struct를 통해서 인스턴스를 생성하는 거는 안되고 반드시 Encodable을 이용해야 할까?

  3. 할일 추가를 해서 데이터를 추가했다면 데이터 추가했음을 mainViewController에 알리고 tableView의 데이터 리스트에 데이터를 추가해줘야 한다

    1. 알리는 방법이 여러개가 있지만,, → 클로저 혹은 delegate, 노티피케이션 센터 등이 있다

    → 해결방법: 클로져로 이벤트를 알려주는 방식으로 진행한다

  4. Post로 할일 목록을 추가하는 부분이 확인을 해보니까 multipartform이어서 그걸로 post를 보낼려고 검색을 해서 multiPartformData로 데이터를 보내는데 데이터가 보내지기는 하는데 response의 데이터가 전부 nilㅠㅠ왜 이러는 걸까,,?

    → multipartFormData는 주로 파일 업로드를 주로 할 때 쓰인다 그러니까 지금 내가 post로 보낼 때는multiplatForm으로 보내면 안된다

    → 즉, 안된이유는 보내는 부분의 형식과 받는 부분의 형식이 달라서이다

    → 받는 부분은 form 데이터 형식으로 받고 있지만 보내는 부분에서 계속 multipart-form을 사용하고 있어서 그런 것

    → 그리고 success로 찍히고 있지만 debugPring(response)를 이용해서 response 자체가 어떻게 들어오고 있는지 확인할 수 있다!!!

    → post하고 form데이터로 보내면 된다

  5. router할 때 url이 공통적인 부분도 있고 전부다 다른 부분도 있는데 그건 어떻게 할까

    • enum에서 router처리를 해줄 때 baseURL이랑 endpoint 변수를 둬서 관리를 한다

  6. 특정 페이지를 통해서 가지고 오기 위해서는 query params를 통해서 가지고 와야하는데 ?가 %3이런식으로 표현이 되었다

    1. 이유url string을 퍼센트 인코딩을 해야 하기 때문이다

    2. 즉, swift가 url을 제대로 인코딩을 어떻게 해야하는지 몰랐기 때문에

      → String을 addingPercentEncoding을 통해서 url형식에 맞도록 변경해줘야 한다

    3. BASE_URL 뒤에 endPoint를 붙임(string.appending)

    4. addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed)로 인코딩할 수 있도록 해주기

    5. string을 URL로 변경하기

  7. 무한스크롤 → 변수를 하나 두고 그걸 통해서 api를 불러오는 중이고 아닌지를 판단할 수 있다

    1. 스크롤 뷰 만들어 놓기
    2. 특정 위치에 스크롤이 도착하면 푸터를 붙이기
    3. api호출하는 중이 아니라면 api를 호출하고 api를 호출하는 중이라면 다시 호출하지 않도록 변수를 통해서 제어하기

  8. 선택된 할일들을 삭제해야 하는데 이게 api에 선택된 할일 전체 삭제 이런 request가 없어서 그냥 삭제를 api를 여러번 요청을 해야 하는데 그걸 어떻게 해야 할지 모르겠다

하면서 궁금한 부분

  1. responseData로 할지 responseDecodable로 할지 어떻게 결정하는지
  2. responseDecodable을 사용할 때 왜 그냥 response in 해서 사용하는 것이 아니라 (response: DataResonse<TotalResponse, AFError> in으로 하는지 모르겠다
  3. 클로져로 데이터가 새로 추가했음으로 알려줬는데 이렇게 새롭게 데이터를 추가해준 부분을 combine이나 rxSwift로도 처리가 가능한지?
    1. combine으로 처리할 수있다면 어떻게 처리할 수 있는지 궁금합니다
  4. cell에 삭제 버튼을 눌렀을 때 다 하고나서 return을 하면 아래 return cell을 타지 않고 바로 cellForRowAt함수가 끝이 나나,,?
  5. 에러처리는 어떤식으로 할 수 있는지

피드백 받은 부분

  1. 만약에 API를 호출하는 부분이 많아진다면 어떻게 해야할까??

    1. API를 호출하는게 막 30개라면 그때마다 AF.request를 통해서 날리면 귀찮고 힘들어진다!!

    → 해결방법 router를 통해서 미리 API를 어떻게 호출할지 정해놓고 필요한 라우터를 호출하면 된다!

  2. cell에 관해서 정의할께 많아지면 cellForRowAt이 길어지면 유지보수, 코드 파악이 쉽지 않다. cell에 관련된 로직을 따로 뺄 수는 없을까?

    1. 클로져는 뭐다? → 함수이다
      1. 클로져는 함수니까 당연히 extension을 통해서 밖에서 함수로 정의를 할 수 있다
      2. 또한 클로져는 함수를 변수로 만든거니까 extension을 통해서 정의한 함수를 변수로 넘겨줄 수 있다

    → 해결방법 : 당연하지만 필요한 부분을 cellForRowAt에서는 호출만 하고 정의하는 부분은 다른 곳에서 하는 방법이 있다

  3. cell을 그려줄 때 cell에 대한 데이터 정의(id, content)등에 대한 부분을 cellForRowAt에서 하지말고 cellForRowAt은 데이터만 넘겨주고 직접적인 정의는 실제 UI를 그려줄때 하는 방법이 있음

  4. 그리고 deleteCell할 때 tableView에서 데이터를 삭제해주고 reload해주는 부분은 delete를 삭제한 후에 해줘야 한다

  5. 할일이 선택되었는지를 UISwitch를 통해서 하는데 그게 viewController는 선택되었는지 아닌지 알 수 있지만 todoCell과 todoList를 가지고 있는 데이터는 알고 있지 못하다

    • 이렇게 되면 todoCell이 재사용될 때 switch가 on인지 off인지 구분하지 못하기 때문에 반드시 todoCell에 알려서 데이터를 switch의 On/Off에 대해서 알고 있어야 한다
profile
ios 개발을 하고있는 라무의 사적인 기술 블로그

0개의 댓글