1

В моем проекте у меня есть некоторые объекты, которые я показываю с сервера, позволяет называть их Foo's. Когда я получаю фид Foo, я разбираю их в подкласс NSMutableDictionary под названием RemoteFoo и передаю эти объекты RemoteFoo по всему окну для отображения данных.Abstracting NSManagedObject и NSDictionary

Если пользователь в конечном итоге хочет загрузить RemoteFoo, я затем создаю объект NSManagedObject с основными данными, называемый Foo, и создайте его, используя значения из RemoteFoo. Все это работает.

Проблема заключается в том, что если я хочу, чтобы метод работал на RemoteFoo и Foo, я должен дублировать его как в RemoteFoo.m, так и в Foo.m. Кроме того, мое приложение, если полный дублирующих инициализации как:

- (id)initWithFoo:(Foo *)foo; 
- (id)initWithRemoteFoo:(RemoteFoo *)foo; 

Как я могу избежать всего этого кода дублирования в то же время отделения временного удаленного RemoteFoo от сущностей Foo ядро-данных, которые представляют Foo пользователь накопил на местном уровне?

ответ

2

Вы можете просто сохранить все RemoteFoo как Foo и работать с ними. Если вам нужно другое поведение, у вас может быть атрибут Foo, указывающий, удален он или нет.

+0

RemoteFoos постоянно изменяются, хотя, и предлагается в различных списках с сервера несколькими способами, через несколько точек в приложении , Если я сохраню их все, мне придется постоянно обновлять каждую запись Foo, которую у меня есть, поскольку данные для каждого RemoteFoo могут измениться. Я думаю, что это добавит много накладных расходов на производительность моего приложения. Не говоря уже о тысячах RemoteFoo, но только десятки Foo, которые пользователь загрузит. – coneybeare

+0

Это определенно кажется самым простым способом ... как вы думаете, будет ли это удар производительности, используя его, как я описываю в вышеупомянутом комментарии? – coneybeare

+1

Основные данные были сильно настроены на производительность. Вы не можете быть более эффективными с вашим доморощенным решением, чем использовать CoreData. – Jaanus

1

Измените модель основных данных следующим образом. Используйте один экземпляр Foo и добавьте логический атрибут isRemote (или что-то подобное), которое вы по умолчанию установили NO. Когда вы загружаете удаленные объекты, создавайте их как объекты, управляемые Foo, и установите для атрибута isRemote значение yes.

Таким образом, вам нужно иметь дело только с одним экземпляром приложения, сохраняя при этом возможность четко различать локальные и удаленные объекты Foo. Если ваше приложение позволяет это, вы можете даже объявить атрибут isRemote как переходный, чтобы он никогда не хранился на диске, просто в памяти. Если вы не хотите сохранять эту информацию, это может быть лучшим способом.

+0

Этот ответ похож на Яанус, но я не знал о переходном варианте. Это звучит привлекательно, потому что RemoteFoos обычно не меняется в течение одного сеанса, поэтому сохранение звука в памяти вполне нормально. Я буду исследовать больше об этом – coneybeare

+0

Хмм, я неправильно прочитал. Я думал, что весь Фу может быть просторным, но могут быть только колоны. – coneybeare

3

Задумывались ли вы использовать что-то вроде класса кластера -

http://seanmurph.com/weblog/make-your-own-abstract-factory-class-cluster-in-objective-c/

--------- Foo --------   NSManagedObject 
    |     |     | 
RemoteFoo    LocalFoo ------ CoreDataFoo 
+0

Привет, Это определенно способ, которым я хочу идти, но основные объекты данных должны быть подклассом NSMangedObject – coneybeare

+0

. Я знаю, что это немного грязно, но не было бы возможным иметь посредника между основными объектами данных и классом в кластере класса Foo? Я добавлю небольшую диаграмму к своему сообщению Я чувствую, что должен добавить отказ от ответственности, что я очень сонный и очень голодный прямо сейчас, поэтому мои ответы могут быть немного сумасшедшими! –

+0

Как бы работало взаимодействие между LocalFoo и CoreDataFoo? Можете ли вы привести небольшой пример того, как MediatorFoo будет работать и его подключения? – coneybeare