Programming/Mac & iOS

[iOS] CoreData: Concurrency & Performance

MB Brad KWON 2016. 5. 16. 22:07

Concurrency


    이번엔 개발자들에게 엄청난 이점을 가져다 줌과 동시에 엄청난 짐을 안겨주는 멀티 쓰레딩에 관한 얘기다. CoreData는 Cocoa 플랫폼에서 제공하여 코드의 양을 줄이고, 사용하기 편한 데이터베이스이다. CoreData를 Concurrency하게 사용하면서 성능을 향상시키는 방법에 대해 알아 보겠다.


    일단 CoreData에서는 2가지 타입의 Concurrency 옵션을 제공한다. NSMainQueueConcurrencyType와 NSPrivateQueueConcurrencyType이다. NSMainQueueConcurrencyType는 앱의  main therad에 의해서 사용되어진다. NSPrivateQueueConcurrencyType는 NSManagedObjectContext 객체에서 별도로 사용하는 큐이다. 그래서 NSManagedObjectContext의 'performBlock:'이나 'performBlockAndWait:'에 의해서만 접근이 가능하다. 


    DB에서 처리하는 Data proccessing의 경우, Main thread에서 처리하면 Main thread의 자원을 사용함으로써 상대적으로 UI의 반응성 저하를 유발할 수 있기 때문에 NSPrivateQueueConcurrencyType를 사용하는 것이 유리하다. JSON이나 XML context에서 data를 가져와 처리하는 경우, Context를 파싱하는 동작도 'performBlock:'이나 'performBlockAndWait:'등에서 처리하면 Main thread를 피해 동시성과 반응성 향상에 좋다. (이제 생각해 보니, 상용 프로젝트에서 NSPrivateQueueConcurrencyType을 사용했음에도 불구하고 공부한 바와 같이 효율적으로 구현하지 못한듯 하다....)


    NSManagedObject 객체들은 각각 다른 큐를 가로지를 수 없다. 이를 수행하게 되면 데이터의 무결성이 훼손되거나 앱의 크래시를 유발하게 된다. 이를 방지하기 위해 NSManagedObject에서 NSManagedObjectID를 이용하여 처리하도록 한다.



출처 : https://goo.gl/i0EsWT




Performance


Fetching Managed Object

-여러 조건이 복합적인 Precidate를 사용할 때, 그냥 사용하는 것보다 non-textual을 사용한 후 textual을 사용하는 것이 더 좋다. Unicode searching이 느리기 때문이다. 


-Fetch Limits을 설정하여 메모리 상에 로드되는 Managed object의 수를 줄이는 방법이 있다. 만약에 Limit을 사용하여 가져온 100개 이후의 데이터를 더 로드하고 싶다면 'fetchOffset'을 사용하여 전체 데이터 중 sub-sequence만 가져오면 된다.



출처 : https://goo.gl/SSfBQT