2017-01-20 19 views
0

У меня есть RESTfulAPI, из которого я извлекаю большой набор данных. Я сохраняющиеся его локально с помощью Realm и следующий вызов:Управление сделками с недвижимым имуществом

func addObjectType(object: ObjectType){ 
    // Check for existence of data 
    if (realm.object(ofType: ObjectType.self, forPrimaryKey: object.id) == nil) { 
     // Persist your data easily 
     try! realm.write { 
      realm.add(object) 
     } 
    } 
} 

Приложение имеет функцию, чтобы удалить данные локально. Я осуществил это как следующий:

func deleteAllData() { 
    if(!realm.isEmpty){ 
     do{ 
      if(!realm.isInWriteTransaction) { 
       realm.beginWrite() 
       realm.deleteAll() 
       try! realm.commitWrite() 
      } 
     } 
     NotificationCenter.default.post(name: Notification.Name("updateUI"), object: nil) 
    } 
} 

Однако, глядя на Realm документации я вижу следующее:

Обозначает ли Realm в настоящее время в операции записи.

Предупреждение

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

Является ли моя реализация правильной?

Я чувствую, что не хватает некоторых проверки .. Общее правило эмпирическое

+0

Вы должны всегда «commitWrite» после того, как закончите добавление/обновление, нет необходимости проверять 'isInWriteTransaction', и область, о которой говорилось выше, не требуется проверять, так как она снизит производительность. – Tj3n

+0

Должен ли я сделать это и при добавлении нового объект через запись? (см. первый метод addObjectType) – mm24

+0

Вам не нужно вызывать его, если вы используете закрытие записи, но проверка 'isInWriteTransaction' в большинстве случаев является чрезмерной осторожностью, поскольку у них есть закрытие записи – Tj3n

ответ

0

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

Операции записи в реальном времени автономны в отдельных потоках. Если фоновый поток выполняет транзакцию записи, все остальные транзакции на других потоках будут заблокированы. В результате этого нет необходимости проверять isInWriteTransaction, если транзакция записи не открыта в этом конкретном потоке.

Итак, нет, вы не пропустите никаких дополнительных проверок. До тех пор, пока вы случайно не оставите транзакцию записи открытой в другом месте, вы даже можете уменьшить количество проверок, которые у вас есть. :)