Coder Social home page Coder Social logo

dev_floor's Introduction

치타🐆 개발자

Top Langs

Hits

dev_floor's People

Contributors

akapuch avatar

Watchers

 avatar

dev_floor's Issues

Core Data의 용도

로컬 DB 활용에 대한 고민

현재 사용 목적은 즐겨찾기 등록/해제 목적

  • 반드시 데이터베이스 사용해야 함. 앱이 재실행 되었을 때도 히스토리가 남아있어야하기 때문에..

  • urlsession으로 앱이 실행될때마다 데이터를 비동기로 가져오는 것은 너무 많은 시간 소요, 여러 문제 발생

  • 로컬 데이터베이스에 가져온 데이터를 저장하고, 필요할 때마다 트랜잭션

  • 로컬 데이터베이스에서 날짜 순으로 정렬하면 포스팅이 순서없이 표시되는 문제 해결 가능

의문점

  • 최초 앱 구동 시에는 초기 데이터를 비동기 네트워킹을 통해 받아와야 하긴 할텐데, 로컬 db에 미리 담아서 배포하거나 다운로드 시 로컬 db에 담는 것이 가능한지

  • 즐겨찾기 데이터만 저장할 때보다 로컬 db가 무거워질텐데 용량을 많이 차지하게 되면 앱 동작에도 영향을 주는지..(앱 실행 같은)

  • 최신 정보를 받아오기 위해서라도 urlSession을 통해 비동기 통신을 시도할텐데, 모든 데이터 파싱해오는 것과 비교했을 때

    • 로컬 데이터베이스에서 가장 최근 데이터의 date 정보 이후의 포스트만 파싱하기
    • 로컬 db에서 예전 데이터 조회하여 가져오기

    이 두 작업의 리소스가 덜 소모되는지 : 로컬 db 트랜잭션이 비동기 통신보다 빠른지!

[화면 1] RSS 이용 네트워킹 및 XML 파싱 후 테이블 뷰 연동

데이터 핸들링 흐름

  1. DataAsset의 blog RSS 정보가 저장된 devBlog.json -> Blog 구조체로 디코딩 후 blogs 배열에 저장
  2. XMLParser로 blogs 배열의 RSS컬럼 정보로 파싱하여 다시 BlogPost 클래스 형태로 blogPosts 배열에 저장
    - urlSession으로 rss주소에 접근하기 때문에 글로벌 큐(백그라운드)에서 수행
    - parse() 작업이 같은 background쓰레드에서 비동기적으로 수행된다.
  3. RSS 1개 파싱이 끝날 때마다 메인쓰레드에서 비동기적으로 테이블 뷰의 reloadData()를 통해 테이블 데이터 갱신
    - 동기로 수행시 하나의 reloadData() 작업이 끝나기도 전에 다른 url의 parse()가 완료되어 reloadData()가 끊이지않고, main은 UI를 그릴수없게됨.
  4. cellForRowAt, numberOfRowsInSection 호출. cellForRowAt에서 indexpath의 셀에 접근하여 셀 구성요소에 blogPosts배열의 BlogPost 클래스 정보 할당

문제점

  • 앱 첫 시작 시에 모든 데이터를 화면에 띄우는데 10~20초 소요. 추후 로직 더 추가시 더 많은 시간 소요 가능성
  • 모든 데이터 로드 전 악세서리 뷰(즐겨찾기 등록 상호작용) 선택 시 선택된 셀이 아닌 다른 셀에도 영향
  • 비동기 작업이기에 파싱이 끝나는 순서가 보장이 되지않음. 앱 실행할 때마다 포스팅 노출되는 순서가 달라질 수 있다.

예상 해결방안

  • 최초 데이터 로드가 느린 문제 : 앱 설치 후 최초 실행 시점때 데이터를 로컬 db에 저장하고 db 트랜잭션을 통해 로드, 이후 추가되는 데이터들은 기존 방식대로 로드 + 로컬db 저장 -> core Data 활용 고민과 연결됨
  • 순서가 보장되지 않는 문제 : getNetwork(_ content : [Blog])가 마무리 된 후 reloadData()가 필요할 것 같음.

[화면 1]상단 포스팅 카테고리 기준으로 데이터를 필터링할 수 있는 검색 바 구현

UISearchBar를 통한 검색 process

  1. textDidChange에서 입력된 단어를 한 글자 단위로 감지
  2. 해당 시점에 blogPosts 배열을 초기화하고 getNetwork() 호출
  3. 데이터 핸들링 흐름과 상동, rss 태그 파싱 로직 중 감지된 단어가 카테고리에 포함되어 있는지 검사

문제점

  • 빈번하게 같은 내용의 셀이 테이블뷰에 보여짐.
  • 빠르게 입력시, 또는 입력된 내용 cancelbutton을 통해 지울 시 드물게 runtimeError발생

해결방안

  • 단어가 바뀔때마다 getNetwork()를 호출하면 예를 들어, RUST를 검색했다고 했을 때 RUS와 RUST의 검색결과에 같은 blogPost 클래스가 포함되어 있기에 필연적으로 같은 셀이 생성되는 것 같다.

    방법 1 : 실시간 검색 포기

    • 검색 버튼을 생성해, 버튼을 눌렀을 때 서치바의 텍스트를 검색하도록 구현

    방법 2 : 시간 차 감지 및 이전 작업 취소

    • asyncAfter 및 cancel()를 적절히 사용하기?

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.