2016-07-25 2 views
3

Я хочу, чтобы обновить базу данных Realm в фоновом потоке, как это: (Потому что я получил свежие данные Webservice)Возможно ли сделать копию объекта Realm?

RLMRealm *realm = [RLMRealm defaultRealm]; 
[realm beginWriteTransaction]; 
[realm deleteAllObjects]; // !! 
[Pubs createOrUpdateInRealm:[RLMRealm defaultRealm] withJSONArray:data]; 
[realm commitWriteTransaction]; 

Проблема заключается в том, что я пока удалить & обновить объекты в Realm дб, пользователь может открыть какой-то Detail ViewController, указывающий на некоторый объект Realm (Pubs), который был удален тем временем, поэтому выбрано исключение.

Я не вижу никакого решения для этого, за исключением того, всегда, когда я хотел бы получить доступ к объекту Realm от Detail контроллера или его имущества, что мне нужно будет всегда делать что-то вроде этого:

(Это означает, что всегда получают Объект Realm, но это может, вероятно, тоже сбой).

pub = [Pubs objectsWhere:[NSString stringWithFormat: @"pubId = %lu", (long)_selectedPubId]].firstObject; 

Но я не использую это решение. Я имею в виду, лучше всего было бы, если я мог бы назвать в деталях контроллера представления что-то вроде этого:

pub = [Pubs objectsWhere:[NSString stringWithFormat: @"pubId = %lu", (long)_selectedPubId]].firstObject; 
pub = [pub safeCopy]; 

Так PubRealmObject может быть тем временем удалены, но объект паб соло будет существовать в памяти (только для цели, чтобы Acces его свойства данных).

Так кто-то пытался что-то подобное?

Может быть, даже с использованием некоторых SDK для iOS like this?

Мне нужно только получить доступ к свойствам данных, как я говорю, не работать с такими объектами объектов, как удаление или обновление объекта в db.

Btw Я попытался вызвать обновление Realm db в основном потоке, но проблема в том, что он занимает 5-7 секунд (всего 1000 объектов json), поэтому он отстает от приложения. Вот почему я думаю, что обновление фона & может быть лучше.

Но я думаю, что он может потерпеть неудачу даже при копировании объекта, так что же это за решение? (обновление фона по сравнению с безопасным доступом к объекту Realm)

ответ

12

Обычно это не очень хороший шаблон проектирования, чтобы иметь контроллер вида, полагающийся на модель данных, которую можно удалить из-под нее. Можно проверить, был ли объект Realm удален, чтобы избежать исключений, проверяя его свойство object.invalidated.

В любом случае, чтобы создать отдельно стоящий экземпляр объекта Realm, все, что вам нужно сделать, это:

RLMObject *copiedObject = [[RLMObject alloc] initWithValue:object]; 

Это позволит сделать копию объекта, но это не будет вставлена ​​в любой Realm пример. Обратите внимание: если объект связывается с любыми другими объектами Realm, они также не будут скопированы; новый объект будет просто указывать на существующие копии.

Но я по-прежнему чувствую, что мне нужно упомянуть, что вы, вероятно, могли бы просто сделать вашу реализацию обновления Realm из своего веб-сервиса немного умнее, чтобы избежать необходимости этого.

Если у вас есть объекты a primary key, то при вызове createOrUpdateInRealm существующие объекты будут обновлены новыми значениями.

Удачи вам!

+0

Привет TiM THX для ответа. Я проверю. Что касается метода createOrUpdateInRealm, вы правы, у меня была такая же идея, но я предполагаю, что это не удалит удаленные строки. Они останутся. Поэтому мне пришлось бы найти, которые были удалены и удалены в любом случае, и пользователь может открыть удаленный элемент, и ситуация такая же. Но появление некоторых данных может быть довольно редким, это правда. Так может быть, я мог бы выбирать именно так. Я увижу. – luky