티스토리 뷰
1. 문제
뷰컨트롤러에 텍스트 뷰를 올려주세요.
그리고 앱이 launch 된 지 5분후에 만개의 데이터를 만들고 저장하는 코어 데이터 연산을 해보겠습니다.
CoreDataManager는 이렇게 구성되어있습니다.
그러면 텍스트를 타이핑하다가 5초 후에 CoreData 연산이 시작되면 아무리 타이핑을 입력해도 입력이 안됩니다. UI 담당인 메인 쓰레드가 blocking 되었기 때문이죠!
CoreData 연산이 끝나면 다시 타이핑이 가능해집니다.
그 이유는 무엇일까요...?!?!?!
우리가 사용한 viewContext가 main queue에서 동작하는 친구이기 때문입니다!!
그래서 시간이 오래 걸리는 작업이라면, viewContext 를 사용하면 안됩니다.
사용자의 화면을 blocking 하기 때문이죠!!!
그럼 아래에서 해결 방안을 알아보겠습니다.
해결 방안 전에 CoreData에 대한 사전 지식이 필요합니다.
2. 해결방안을 위한 사전 지식
CoreData Stack은 이렇게 생겼는데요,
이렇게 여러개의 context를 가질 수 있습니다.
(여러개의 context에 대해서는 다른 포스팅에서 다뤄보겠습니다!!)
NSManagedObjectContext 문서에 보면 이니셜라이저에 concurrency 타입을 설정해주게 되어있는데요,
이렇게 두가지 타입이 있습니다.
그동안 썼던 context는 main이 였는데,
private를 사용하여 해결해볼 것 입니다.
3.1 해결방안(1) - newBackgroundContext()
이렇게 코드를 바꿔주세요
newBackgroundContext 메소드를 사용하면,
persistent container가 concurrencyType이 privateQueueConcurrencyType인 NSManagedObjectContext를 만들고 리턴해줍니다.
돌려보면 isMainTread가 false로 출력되면서
coredata 연산이 시작해도 UI가 안 멈추는 것을 볼 수 있습니다.
(그리고 perform 함수를 써줘야지 쓰레드가 바뀌더라구요!!!)
3.2 해결방안(2) - child Context
혹은 child context를 만들어도 됩니다!
(child context에 대한 자세한 내용은 이 포스팅을 참고해주세요)
4. 이상한 점 (좀 더 찾아보고 내용 업데이트 해야겠음)
1)
perform이 아니라 performAndWait를 쓰면
isMainTread가 true로 출력됨.
👉 해결방안 : DispatchQueue.global().async
=> 이렇게 하면 isMainTread false로 출력되고 UI blocking도 안됨.
2)
persistentContainer의 performBackgroundTask 함수를 사용하면
isMainTread가 false로 출력되는데,
연산이 시작하면 UI가 blocking 됨.
3)
newBackgroundContext() + performAndWait 은 sync를 보장하는 반면
childContext + performAndWait 은 sync를 보장안함. (?????)
SourceCode
https://github.com/eunjin3786/CoreDataConcurrency
Reference
https://code.tutsplus.com/tutorials/core-data-from-scratch-concurrency--cms-22131
'🍏 > iOS' 카테고리의 다른 글
[UIFont] Custom 폰트가 안먹을 때, fontName을 확인해보자 (3) | 2020.04.05 |
---|---|
[CoreData] CoreData에서 NSManagedObjectContext 여러개 사용하기 + newBackgroundContext() (0) | 2020.04.04 |
[TextKit] TextKit 구조 그림 (0) | 2020.04.02 |
[ReactorKit] ReactorKit의 Transform 함수에 대해 알아보자 (0) | 2020.03.07 |
[UILabel-HTML] UILabel에 HTML load 하기 또는 HTML 코드를 뺀 텍스트를 넣어주기 (0) | 2020.02.20 |
- Total
- Today
- Yesterday
- Dart Factory
- flutter dynamic link
- flutter build mode
- 플러터 싱글톤
- cocoapod
- Flutter Spacer
- Watch App for iOS App vs Watch App
- flutter deep link
- Flutter Clipboard
- ipad multitasking
- Django FCM
- Flutter getter setter
- 플러터 얼럿
- SerializerMethodField
- 장고 Custom Management Command
- Flutter Text Gradient
- flutter 앱 출시
- Sketch 누끼
- 장고 URL querystring
- Python Type Hint
- ribs
- Django Firebase Cloud Messaging
- METAL
- Django Heroku Scheduler
- PencilKit
- Flutter 로딩
- drf custom error
- DRF APIException
- github actions
- 구글 Geocoding API
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |