0

Я использую performBlock на моем NSManagedObjectContexts, так что мои изменения происходят в правой очереди для данного контекста. Мой вопрос: если я делаю много изменений и методов вызова из performBlock - есть ли простой способ гарантировать, что я использую объекты из соответствующего контекста.Основные данные - общий код, вызываемый из NSManagedObjectContext peformBlock:

Пример:

У меня есть activeAccount Ивар (созданный на главной очереди), который является NSMangedObject для текущей учетной записи в приложении. У меня есть некоторые методы экземпляра, которые используют объект activeAccount для выполнения определенных задач - получения данных, установки данных. Поэтому мой вопрос заключается в том, что я делаю что-то на фоне NSManagedObjectContext, и я вызываю один из этих общих методов - есть ли шаблон, который я могу использовать, чтобы в этих методах я знал использовать либо текущий activeAccount iVar, либо получить новый. Кроме того, если мне нужно сделать что-то, что требует NSManagedObjectContext - как узнать, какой из них можно получить/использовать.

Один метод, который я знаю, для использования которого есть NSManagedObjectContext. У меня есть метод, который проверяет, работает ли он в текущем потоке, - тогда он знает, чтобы вернуть контекст основного потока или контекст фонового потока. Кроме того, если я нахожусь в фоновом потоке, могу ли я прочитать идентификатор объекта activeAccount, который живет в основном потоке, чтобы я мог получить его копию в фоновом потоке? Заранее спасибо.

ответ

0

Брайан,

удержания нити может быть сложным предложением поддержать. Главное, что вам нужно поддерживать, - использовать объекты в их надлежащем MOC. Поскольку каждый управляемый объект поддерживает ссылку как на свой MOC хоста, так и на его идентификатор объекта, это действительно легко обеспечить. Например:

NSManagedObjectContext *newMOC = NSManagedObjectContext.new; 

newMOC.persistentStoreCoordinator = oldActiveAccount.managedObjectContext.persistentStoreCoordinator; 

ActiveAccount *newActiveAccount = [newMOC objectWithID: oldActiveAccount.objectID]; 

Теперь каждый экземпляр вы получаете доступ из newActiveAccount создается в newMOC и, следовательно, поток ограничивается этой МОС. objectID s являются постоянными. -persistentStoreCoordinator редко, если вообще когда-либо, изменяется на mainMOC. Следовательно, вышеуказанный код должным образом ограничен. Существуют проблемы с вышеупомянутой техникой, если исходный MOC является временным. Следовательно, я не могу гарантировать, что приведенный выше код работает в отношении двух фоновых MOC.

Эндрю

0

Я должен спросить первых, почему вы с так много контекстов в использовании и в то же время?

Я использую один для фоновых операций и один для основной темы. Если мне нужно создать еще один для отбрасываемых изменений, я просто создам его и передам, так что теперь мой self.managedObjectContext указывает на контекст проекта. Я никогда не позволю своим управляемым объектам жить в области, где они могли бы получить доступ к множеству контекстов.

Это не совсем понятно, если вы пишете для прошивки или OSX, но с прошивкой, например:

Если мне нужно нажать на новый контроллер представления в навигационный стек я инициализировать managedObjectContext Ивар моего назначения контроллера представления как а также любые экземпляры подкласса NSManagedObject. Поскольку в -prepareForSegue: я знаю, создаю ли контекст проекта или просто передаю свой текущий, я также знаю, нужно ли инициализировать эти экземпляры управляемых объектов, ссылаясь на них по их идентификаторам из вновь созданного контекста, или я могу просто пройти их.

Теперь в контроллере просмотра я могу считать само собой разумеющимся, что мои управляемые объекты всегда привязаны к себе.managedObjectContext.

+0

Я разрабатываю для iOS. У меня действительно есть только два MOC, один для основного потока и один для работы в фоновом режиме. Я думаю, моя проблема в том, что у меня есть код, который я пытаюсь повторно использовать, поэтому я применил методы. Но я не хотел говорить, что метод X может быть запущен только в этом ManagedObjectContext. В одном случае я создаю новое отношение к учетной записи. Объект, который содержит это, имеет учетную запись iVar. Поэтому я пытаюсь решить, могу ли я присоединиться к iVar или мне нужно создать другой объект учетной записи для фонового MOC. Возможно, мне нужно ограничить каждый метод данным MOC. – Brian

Смежные вопросы