iOS5 NSManagedObjectContext Типове едновременност и как се използват?

В момента литературата изглежда малко оскъдна за новите типове едновременност NSManagedObjectContext. Освен видеоклиповете от WWDC 2011 и друга информация, която събрах по пътя, все още ми е трудно да разбера как се използва всеки тип едновременност. По-долу е как тълкувам всеки тип. Моля, поправете ме, ако разбирам нещо неправилно.

NSConfinementConcurrencyType

Този тип е норма през последните няколко години. MOC са екранирани от всяка нишка. Така че, ако MOC на нишка A иска да обедини данни от MOC на нишка B чрез съобщение за запазване, нишка A ще трябва да се абонира за известие за запазване на MOC на нишка B.

NSPrivateQueueConcurrencyType

Всяко MOC дърво (родителски и подчинени MOC) споделят една и съща опашка, без значение в коя нишка е всеки. Така че всеки път, когато се изпрати съобщение за запазване от някой от тези контексти, то се поставя в частна реплика, специално създадена само за това MOC дърво.

NSMainQueueConcurrencyType

Все още съм объркан от този. От това, което разбирам, е като NSPrivateQueueConcurrencyType, само частната опашка се изпълнява в главната нишка. Четох, че това е от полза за комуникацията на потребителския интерфейс с MOC, но защо? Защо да избера това пред NSPrivateQueueConcurrencyType? Предполагам, че тъй като NSMainQueueConcurrencyType се изпълнява в основната нишка, това не позволява ли фонови процеси? Това не е ли същото като да не използвате нишки?


person Gobot    schedule 11.03.2012    source източник


Отговори (3)


Типовете паралелност на опашката ви помагат да управлявате многонишкови основни данни:

И за двата типа действията се извършват само в правилната опашка, когато ги извършвате с помощта на един от методите performBlock. т.е.

[context performBlock:^{
    dataObject.title = @"Title";
    [context save:nil]; // Do actual error handling here
}];

Типът паралелност на частната опашка върши цялата си работа във фонова нишка. Страхотен за обработка или диск io.

Основният тип опашка просто извършва всички свои действия върху UIThread. Това е необходимо, когато трябва да правите неща като обвързване на NSFetchedResultsController с него или всякакви други задачи, свързани с потребителския интерфейс, които трябва да бъдат преплетени с обработката на обектите на този контекст.

Истинското забавление идва, когато ги комбинирате. Представете си, че имате родителски контекст, който върши всичко io във фонова нишка, която е частен контекст на опашка, и след това вършите цялата си работа с потребителския интерфейс срещу дъщерен контекст от основния тип опашка. По същество това прави UIManagedDocument. Позволява ви да запазите опашката на потребителския си интерфейс без натоварената работа, която трябва да се извърши, за да управлявате данни.

person midas06    schedule 15.03.2012

Мисля, че отговорите са в бележката: Бележки за изданието на основните данни за Mac OS X Lion http://developer.apple.com/library/mac/#releasenotes/DataManagement/RN-CoreData/_index.html

За NSPrivateQueueConcurrencyType мисля, че не сте прав. Дъщерен контекст, създаден с този тип едновременност, ще има своя собствена опашка. Контекстът родител/дете не е изцяло свързан с нишката. Изглежда, че родителят/детето опростява комуникацията между контекстите. Разбирам, че просто трябва да запазите промените в дъщерните контексти, за да ги върнете обратно в родителския контекст (все още не съм го тествал). Обикновено контекстният модел родител/дете е свързан с основния модел на опашка/фонова опашка, но не е задължителен. [РЕДАКТИРАНЕ] Изглежда, че достъпът до магазина (Запазване и Зареждане) се извършва чрез основния контекст (в основната опашка). Така че не е добро решение да се извършват фонови извличания, тъй като заявката зад executeFetchRequest винаги ще се изпълнява в главната опашка.

За NSMainQueueConcurrencyType той е същият като NSPrivateQueueConcurrencyType, но тъй като е свързан с основната опашка, разбирам, че извършвате операция с контекста, без непременно да използвате performBlock; ако сте в контекста на главната опашка, например в делегирания код на контролера View (viewDidLoad и т.н.).

person FKDev    schedule 30.03.2012

midas06 написа:

Представете си, че имате родителски контекст, който върши всичко io във фонова нишка, която е частен контекст на опашка, и след това вършите цялата си работа с потребителския интерфейс срещу дъщерен контекст от основния тип опашка.

Разбрах, че е обратното: поставяте родителския контекст в основната нишка с помощта на NSMainQueueConcurrencyType и дъщерния контекст на фоновата нишка с помощта на NSPrivateQueyeConcurrencyType. Греша ли?

person Paul Heller    schedule 06.04.2012