Под юбкой CoreData.

При дебаге CoreData часто бывает необходимо отслеживать ее изменения. Частично эту проблему решает перехват NSManagedContextDidSaveNotification и расставление NSLog’ов в нужных местах. Таким образом мы увидим все изменения наших контекстов, что в принципе неплохо, но что если копнуть глубже и узнать все SQL запросы, которые выполняются при этом в нашей базе?

deeper

Все что для этого нужно – установить аргумент:

-com.apple.CoreData.SQLDebug

Идем в Edit Scheme -> Arguments:

CoreData
устанавливаем значение от 0 до 3 (в зависимости от желаемого debug level).

This is it.
После таких не хитрых манипуляций в консоли вы увидите информацию о том, что происходит с базой во время работы вашего замечательного приложения.
Все запросы и время их выполнения, системную информацию, etc.

2014-03-09 14:27:58.057 Casual[39330:a0b] CoreData: annotation: Connecting to sqlite database file at "/Users/Krivoblotsky/Library/Application Support/iPhone Simulator/7.0.3/Applications/F8C28503-D821-41FD-A3DC-94A561119092/Documents/Casual.sqlite"
2014-03-09 14:27:58.059 Casual[39330:a0b] CoreData: sql: pragma journal_mode=wal
2014-03-09 14:27:58.095 Casual[39330:a0b] CoreData: sql: pragma cache_size=200
2014-03-09 14:27:58.096 Casual[39330:a0b] CoreData: sql: SELECT Z_VERSION, Z_UUID, Z_PLIST FROM Z_METADATA
2014-03-09 14:27:58.098 Casual[39330:a0b] CoreData: sql: SELECT 0, t0.Z_PK, t0.Z_OPT, t0.ZCREATEDAT, t0.ZDESC, t0.ZIMAGEID, t0.ZNAME, t0.ZREMOTEID, t0.ZWORKSPACEUSERID FROM ZWORKSPACE t0 ORDER BY t0.ZCREATEDAT DESC
2014-03-09 14:27:58.099 Casual[39330:a0b] CoreData: annotation: sql connection fetch time: 0.0006s
2014-03-09 14:27:58.100 Casual[39330:a0b] CoreData: annotation: fetch using NSSQLiteStatement <0xca78120> on entity 'Workspace' with sql text 'SELECT 0, t0.Z_PK, t0.Z_OPT, t0.ZCREATEDAT, t0.ZDESC, t0.ZIMAGEID, t0.ZNAME, t0.ZREMOTEID, t0.ZWORKSPACEUSERID FROM ZWORKSPACE t0 ORDER BY t0.ZCREATEDAT DESC' returned 6 rows with values: (
    "<Workspace: 0xc8648c0> (entity: Workspace; id: 0xc863ba0 <x-coredata://E57ED370-9AD5-4BED-BB66-00ED9EFAB9E2/Workspace/p13> ; data: <fault>)",
    "<Workspace: 0xc864b70> (entity: Workspace; id: 0xc8602d0 <x-coredata://E57ED370-9AD5-4BED-BB66-00ED9EFAB9E2/Workspace/p18> ; data: <fault>)",
    "<Workspace: 0xc864c50> (entity: Workspace; id: 0xc8602e0 <x-coredata://E57ED370-9AD5-4BED-BB66-00ED9EFAB9E2/Workspace/p14> ; data: <fault>)",
    "<Workspace: 0xc864d70> (entity: Workspace; id: 0xc8620c0 <x-coredata://E57ED370-9AD5-4BED-BB66-00ED9EFAB9E2/Workspace/p16> ; data: <fault>)",
    "<Workspace: 0xc864e30> (entity: Workspace; id: 0xc8620d0 <x-coredata://E57ED370-9AD5-4BED-BB66-00ED9EFAB9E2/Workspace/p17> ; data: <fault>)",
    "<Workspace: 0xc864f40> (entity: Workspace; id: 0xc8620e0 <x-coredata://E57ED370-9AD5-4BED-BB66-00ED9EFAB9E2/Workspace/p15> ; data: <fault>)"
)
2014-03-09 14:27:58.314 Casual[39330:a0b] CoreData: annotation: total fetch execution time: 0.2157s for 6 rows.

В паре с CoreData Profiler Tool – это замечательный способ отлавливать дублированные и медленные запросы, видеть результаты их оптимизации.

Удачного дебага!

P.S.
Рекомендую видео:
“Core Data Performance Optimization and Debugging” из WWDC 2013 Session Videos

Google+0LinkedIn1Twitter0Facebook0

Leave a Reply

Your email address will not be published.

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>