core data blog posts by jacobs

튜토리얼 리스트

https://code.tutsplus.com/series/core-data-and-swift–cms-907

core data stack 기본 개념 구조

https://code.tutsplus.com/tutorials/core-data-and-swift-core-data-stack–cms-25065

xcode에서  .xcdatamodeld화일을 editor를 통해 열고 Data Model 를 만들고 수정하는 방법 설명

https://code.tutsplus.com/tutorials/core-data-and-swift-data-model–cms-25067

managed object(record) create, delete, fetch, update 하는 방법과 간단한 faulting으로 메모리 절약하는 방법 설명

https://code.tutsplus.com/tutorials/core-data-and-swift-managed-objects-and-fetch-requests–cms-25068

relationship 으로 연결된 managed object를 추가하는 방법과 sorting과 predicates이 첨가된 fetch방법 설명

https://code.tutsplus.com/tutorials/core-data-and-swift-relationships-and-more-fetching–cms-25070

core data 사용 실예에 대한 전반적인 내용  (NSFetchedResultsController 사용 방법 포함)

https://code.tutsplus.com/tutorials/core-data-and-swift-nsfetchedresultscontroller–cms-25072

core data 사용 실예에 대한 전반적인 내용2  (NSFetchedResultsController 사용 방법 포함2)

https://code.tutsplus.com/tutorials/core-data-and-swift-more-nsfetchedresultscontroller–cms-25078

migration 과 migration시 문제 처리방법

https://code.tutsplus.com/tutorials/core-data-and-swift-migrations–cms-25084

subclassing NSManagedObject

https://code.tutsplus.com/tutorials/core-data-and-swift-subclassing-nsmanagedobject–cms-25116

core data concurrency

https://code.tutsplus.com/tutorials/core-data-and-swift-concurrency–cms-25118


core data batch update

https://code.tutsplus.com/tutorials/core-data-and-swift-batch-updates–cms-25120

core data batch delete

https://code.tutsplus.com/tutorials/core-data-and-swift-batch-deletes–cms-25380

asynchronous fetch

https://code.tutsplus.com/tutorials/core-data-and-swift-asynchronous-fetching–cms-25123


core data by graig (youtube)

https://youtu.be/2idtKQ_NqTs    Introduction – Beginning Core Data

https://youtu.be/PMze4tT2w_U    – Getting Started – Beginning Core Data

https://youtu.be/62A-zAzc0aE    – NSManagedObject Subclasses – Beginning Core Data

4:16 에 나오는 코드 부분 개요

tab controller 그다음 navigation controller 그 안에서 제일 위의 top controller 에 접근한다. 그리고 respondsToSelector()를 통해 그안에 setManagedObjectContext() 가 있는지 확인하고 있으면 performSelector()를 이용 그 함수를 수행한다.

참고) http://weimenglee.blogspot.com/2014/09/swift-checking-if-method-exists.html

https://youtu.be/kNztJgGbQTM    – Editing and Deleting Data – Beginning Core Data

https://youtu.be/uJuLk1niBYA    -Relationships – Beginning Core Data

https://youtu.be/oK1K5h5EbZY    – Predicates and Sorting – Beginning Core Data

https://youtu.be/hRBr1mLZFaY    -Conclusion – Beginning Core Data

https://youtu.be/pp0zOJZcYhI    – Introduction – Intermediate Core Data

https://youtu.be/lMT96wUsjMQ    – Managed Object Contexts – Intermediate Core Data

https://youtu.be/lMT96wUsjMQ   – Conclusion – Intermediate Core Data

https://youtu.be/ZRwXbb1cOFw   -fetched result controller

GCD (grand central dispatch)

original source : https://blog.bobthedeveloper.io/intro-to-grand-central-dispatch-in-swift-3-with-bob-lee-1d4b56f731b3 

gcd에서는 기본적으로 두가지의 종류의 작업자를 제공한다. (하나는 많은 리소스를 필요로하는 작업에 적합하고(heavy) 하나는 좀더 약한 작업에 적합하다(lightweight). 사용자가 추가로 필요한 경우 lightweigth 작업자를 추가 만들수 있다.)

let main = DispatchQueue.main // heavy 작업자 만들기
let background = DispatchQueue.global() // ios에서 제공하는 lightweight 작업자 만들기
let helper = DispatchQueue(label: "construction_worker_3") // 추가로 lightweight 작업자 만들기
func doSyncWork() { 
background.sync { for _ in 1...3 { print(“Light”) } }
for _ in 1...3 { print(“Heavy”) } } // main
doSyncWork() 
// Light
// Light
// Light
// Heavy
// Heavy
// Heavy

func doAsyncWork() { 
background.async { for _ in 1...3 { print(“Light”) } }
for _ in 1...3 { print(“Heavy”) } }                // main
doAsyncWork() 
// Light
// Heavy
// Heavy
// Light
// Heavy
// Light
let asianWorker = DispatchQueue(label: "construction_worker_1")
let brownWorker = DispatchQueue(label: "construction_worker_2")
func doLightWork() {
asianWorker.async { for _ in 1...10 { print("👷") } }
 brownWorker.async { for _ in 1...10 { print("👷🏽") } } }
doLightWork()
// 👷, 👷🏽, 👷, 👷🏽, 👷, 👷🏽, 👷, 👷🏽, 👷...

참조) https://learnappmaking.com/grand-central-dispatch-swift/

함수형태의 gcd 이용 예시 (swift 3 이전형태)

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)) {  
    // Download file or perform expensive task

    dispatch_async(dispatch_get_main_queue()) {  
        // Update the UI  
    }
}

oop 형태의 gcd 이용 예시 (swift 3 이후형태)

DispatchQueue.global(qos: .userInitiated).async {  
    // Download file or perform expensive task

    DispatchQueue.main.async {  
        // Update the UI  
    }
}

dispatch_async와 dispatch_sync 와의 차이

https://stackoverflow.com/a/19822753/3151712

DispatchQueue에서의 qos, concurrency(제빠르게 threads간에 switch함으로써 동시에 일어나는 착각일으킴)

https://medium.com/@JoyceMatos/grand-central-dispatch-swift-3-93f995c15fd2


core data 

managed object context

  • performBlock:  Asynchronously performs a given block on the context’s queue.
  • performBlockAndWait:  Synchronously performs a given block on the context’s queue.

concurrency에 관한 tutorial

core data에서 concurrency를 이용하는 이유는 data persistence가 file에 저장하는데 시간이 걸리는데 이 동안 main ui thread가 막힘이 없게 하는것이 목적이다.

https://www.youtube.com/watch?v=lMT96wUsjMQ&index=9&list=PL23Revp-82LImHA8jL2dLaN_67pABFcyJ


Operation Queue

참고사항) https://agostini.tech/2017/07/30/understanding-operation-and-operationqueue-in-swift/#comment-141

operation을 이용한 threading 작업은 GCD를 기반으로 한다.

class 클래스이름: Operation {

   init() {

     …

   }

   override func main() {
        …
       }        

}

의 형태를 가진 작업을 만든다. 

// operationqueue를 생성한다.

private let operationQueue: OperationQueue = OperationQueue()

operationQueue.addOperations([생성된Operation, 생성된또다른Operation], waitUntilFinished: false)

수행하려는 작업이 다른 작업의 완료에 의존하는 경우(다른작업이 확실히 끝나고 나서 수행해야하는 경우)  

나중에수행될Operation.addDependency(우선수행되야하는Operation)

You might think that with OperationQueues and Operations there’s no need for GCD but they actually work together. Fun fact: Operations are built on top of GCD.Queue is a prioritised FIFO queue. he most common use of GCD is to run a piece of code on the main thread – like the ‘onCompleted’ closure in our example here: 

DispatchQueue.main.async(execute: {
  onCompleted?(listItems)
})

NSManagedObject를 직접이용 core data 를 이용 managed objects 를 만들고 add,  fetch 하는 과정 (이렇게 사용하는 경우의 문제를 보완하는 것이 NSManagedObject를 subclassing 해서 사용하는 것이다. https://youtu.be/62A-zAzc0aE )

만들고 add 하는 과정

image

fetch하는 과정

image

core data 기본개념을 설명한 동영상

managed object model (managed object)

persistent store coordinator (persistent store)

managed object context 

초기에 생성될때 위의 순으로 만들어진다.

실제 managed object context를 거쳐 많은 작업(create, delete, fetch …. )을 하게된다.

persistent store 는 실제 data가 저장되는 장소를 말하며 (sqlite, binary store, in-memory store 가 될수 있다)