2015-04-03 5 views
0

Я использую основные данные, чтобы увидеть, видели ли пользователи в представлении таблицы раньше пользователя. Способ, которым я это делаю, - сохранить сообщение Id в Core Data при первом просмотре, а затем запустить запрос выборки, когда я обновляю представление таблицы, чтобы увидеть, есть ли запись в постоянной памяти с тем же идентификатором. Теперь я хочу знать, как я должен наиболее эффективно реализовать свой запрос на выборку, исходя из того, сколько времени это занимает. Должен ли я запускать запрос, который возвращает все сохраненные идентификаторы сообщений в виде массива при загрузке представления, а затем в cellForRowAtIndexPath проверить, содержит ли этот массив идентификатор сообщения этой ячейки или запустить запрос на выборку с предикатом в cellForRowAtIndexPath? Последний был бы моим предпочтительным методом, но если у меня есть 100 или около того, то я подумал, будет ли это плохой этикет. Любая помощь будет очень оценена.Запрос на выборку данных ядра Core iOS, как использовать

Это мой принести запрос:

func persistQuery(predicateValueString: String!) -> Bool! { 

let fetchRequest = NSFetchRequest(entityName: "LogItem") 
let predicate = NSPredicate(format: "itemText == %@", predicateValueString) 

fetchRequest.predicate = predicate 

var didFindResult = true 

if let fetchResults = managedObjectContext!.executeFetchRequest(fetchRequest, error: nil) as? [LogItem] { 

    if fetchResults.count == 0 { 
     didFindResult=false 
    } 
} 

return didFindResult 

}

+0

Попробуйте оба варианта и просмотрите их, чтобы узнать, какой из них лучше (и, как правило, не беспокойтесь об этом, если не наблюдаете проблему при тестировании в ожидаемых условиях) – Wain

ответ

0

Лучший способ заключается в использовании NSFetchedResultsController. Он также оптимизирует выборку и объем памяти. Он специально разработан для просмотра таблиц.

Для начала ознакомьтесь с шаблоном Xcode (Master/Detail, check Core Data). Это очень просто.

Удостоверьтесь, что вы также применяете методы делегатов - они будут автоматически вызываться, когда ваши управляемые объекты меняются, поэтому выполняется только минимальный код, который выполняется для обновления интерфейса (только если объект фактически находится на экране).

Предполагается, что каждая из ваших ячеек просмотра таблицы представляет собой LogItem (подкласс NSManagedObject) с свойством, указывающим статус read. После того как вы измените это, метод делегата попытается обновить его на основе пути индекса.

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

+0

Спасибо за полезный ответ, однако я фактически не использую сохраненные данные для заполнения таблицы. Источник данных поступает из нашего бэкэнд, но чтобы мои запросы на сервере были низкими, я сохраняю статус чтения на самом устройстве. – TimWhiting

+0

Я вижу. Вы должны хранить данные, которые будут отображаться на устройстве, а не только в памяти. Вышеприведенная схема подходит. Вы все равно разбираете весь текст сообщения. Возможно, если бы у вас были только идентификаторы, вы могли бы уменьшить их, но UX, скорее всего, будет лучше, если вы сможете сохранить данные локально. – Mundi

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