2010-10-17 5 views
3

Я хочу синхронизировать основные данные на iPhone с MongoDB на сервере Sinatra.Как установить NSManagedObjectID вручную?

Когда iPhone получает сообщение от чат-сервера Node.js, сообщение содержит BSON ObjectId (строка) отправителя. Для iPhone, чтобы сохранить это сообщение, я нахожу пользователя с тем же Id в Core Data. Я хочу сделать что-то вроде objectWithID. Другими словами, я хочу установить NSManagedObjectID как те же, что и объекты MongoDB BSON ObjectIds. Другая вещь, которую я бы проверил, - это отсутствие пользователей с идентификатором отправителя в файле managedObjectContext, я заберу его из persistentStore, и если его там нет, я его создам. Это нужно сделать, чтобы поддерживать связь между Message и Sender. Возможно, я должен просто сохранить атрибут отправителя объекта Message как свой BSON ObjectId в виде строки, а не как пользовательский NSManagedObject.

Что вы рекомендуете? Должен ли я просто использовать MongoDB на iPhone тоже? Я просто понял, что для него есть драйвер Objective-C. Но я только начал получать данные Core Data, и у него есть классные вещи (например, поддержка отмены), которые я могу использовать ... Прямо сейчас, я просто использую его для простого извлечения & постоянного хранилища, поэтому я может заменить его. Но я планирую реализовать отмену поддержки в будущем, просто потому, что я считаю, что это хорошая юзабилити. Я предпочитаю вариант отменить, чем ответить на всплывающее окно подтверждения, например, мне нравится, как GMail позволяет отменить отправку или отменить удаление сообщений и т. Д.

Спасибо!

Matt

ответ

3

Вы не можете установить ObjectId из ядра данных объекта вручную. Вероятно, вы захотите добавить атрибут externalID или что-то, где вы храните ID, полученный с сервера.

См. this article для размышлений о том, следует ли использовать данные ядра. Обратите внимание, что рекомендация автора заключается в том, чтобы придерживаться основных данных почти во всех случаях.

+0

Это отличная статья. У меня была аналогичная проблема для решения, и я придерживался Core Data с атрибутом 'remoteID' Int32. Производительность - определенно проблема, с узким местом, выполняющим выборку для каждого элемента с ключом на remoteID, чтобы узнать, находится ли он уже в MOC. 100 или около того такие выборки занимают около 1 секунды на iPhone 3GS, но 5 секунд на iPhone первого поколения. Возможные улучшения состоят в том, чтобы извлекать сразу несколько элементов с помощью предиката 'IN' и делать это в фоновом потоке. –

+0

Спасибо, да, я думаю, что собираюсь придерживаться Core Data и делать то, что вы предлагаете, особенно. потому что я использую 'NSFetchedResultsController', о котором я забыл упомянуть в моем вопросе. – ma11hew28

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