2015-10-31 4 views
0

В моем приложении пользователь может выбрать несколько контактов в коллекции. Когда он выбирает ячейку свойство «IsSelected» на соответствующем объекте «контакт» будет установлен верно и CollectionView обновляет выбранную ячейку:Realm: Обновление свойства slow

func collectionView(collectionView: UICollectionView, didSelectItemAtIndexPath indexPath: NSIndexPath) { 
     let contact: self.filteredContacts[indexPath.row] 
     self.invertSelectionStatusOfContact(contact) 
     self.collectionView?.reloadItemsAtIndexPaths([indexPath]) 
} 

func invertSelectionStatusOfContact(contact:Contact){ 

    try! self.realm.write { 
     contact.isSelected = !contact.isSelected 
    } 
} 

Там есть задержка со всего 500мс, который был намного быстрее, когда я использовал coredata. Есть ли что-то, что я могу, чтобы повысить производительность?

ответ

1

У меня была аналогичная проблема, и в конце концов я решил не использовать realm.write динамически (каждый раз, когда пользователь выбирает контакт).

Вместо того, я решил сохранить ссылки на мои контакты объектов в моем ViewController и изменить свойство isSelected:

func collectionView(collectionView: UICollectionView, didSelectItemAtIndexPath indexPath: NSIndexPath) { 
    let contact: self.filteredContacts[indexPath.row] 
    contact.isSelected = !contact.isSelected 
    self.collectionView?.reloadItemsAtIndexPaths([indexPath]) 
} 

Не забудьте обновить ваш контактный объект с realm.write(), когда пользователь собирается оставить ViewController.

Весь трюк используется для realm.write() только один раз. Попытайтесь выяснить, когда это хороший момент для этого.

EDIT Я не думаю, что вы могли бы улучшить работу транзакции Realm write. Это определенно занимает много времени, в основном из-за ввода-вывода файлов.

+0

Но вне транзакции с записью это приводит к сбою? -> Попытка изменить объект за пределами транзакции записи - сначала вызовите beginWriteTransaction в экземпляре RLMRealm. – netshark1000

+0

Извините, я забыл, что вы не можете редактировать объект Realm вне 'Write Transaction'. Дело в том, чтобы создать новые объекты Realm ('Contact()') и использовать его. А затем замените старый на новый, обновленный. Меня устраивает. Насколько я помню, используя Swift, вы должны инициализировать новый объект с параметром: 'updates: true' (если вы используете первичный ключ). Надеюсь, это поможет. Дайте мне знать, если у вас возникнут проблемы. – zuziaka

+0

Вы должны убедиться, что ваш объект «Контакт» имеет первичный ключ в этом случае. Кроме того, вы также можете управлять изменениями в состояниях выбора в словаре. Пакетная запись в более крупные транзакции, как правило, очень хорошая идея с Realm. – marius

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