2013-04-15 1 views
0

Я оптимизирую свое первое приложение для iOS, прежде чем оно попадет в магазин, и отметив методы, которые занимают, казалось бы, большее количество времени. У меня есть довольно простое приложение с основными деталями, в котором объекты из SQLite Core Data показаны в UITableView, а затем нажатие на один приводит к подробному представлению, в котором пользователь может пометить его как любимый (установив флаг BOOL в этом объекте на YES. Как только они попали их любимую кнопку, я называю [NSManagedObjectContext save], чтобы гарантировать, что их изменения отражаются немедленно, а в случае незапланированного прекратить и т.д.Производительность метода NSManagedObjectContext

Это save операция в настоящее время принимает вокруг 205ms при тестировании на моем iPhone 4S. Там составляют около 4500 записей в базе данных, каждая из которых содержит несколько строк и несколько булевых значений (завернутые в NSNumber с).

Первый вопрос: , если это потребуется? Я устанавливаю только одно логическое значение, а затем сохраняю контекст, но я никогда не использовал Core Data, поэтому не знаю, нормально ли это.

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

- (IBAction) makeFavorite: (id) sender 
{ 
    [self.delegate detailViewControllerDidMakeFavorite]; 
    [_selectedLine setIsLiked: [NSNumber numberWithBool: YES]]; 
    [_selectedLine setIsDisliked: [NSNumber numberWithBool: NO]]; 
    NSError *error; 
    if (![[[CDManager sharedManager] managedObjectContext] save:&error]) NSLog(@"Saving changes failed: %@, %@", error, [error userInfo]); 
} 

Может быть, я тревожиться по пустякам (я все еще относительно новый программист), но на более широкой ноте, 200мс достаточно для меня, по крайней мере, попытаться решить этот вопрос, не так ли? :)

ответ

1

Рассмотрите UIManagedDocument. Он автоматически обрабатывает сохранение в фоновом контексте. Я особенно рекомендую его, если вы на iOS 6. Если вы не передаете идентификаторы объектов вокруг или не сливаетесь с другими контекстами, вы должны иметь возможность использовать его достаточно легко и надежно.

Ваш простой пример использования выглядит специально для него.

+0

Я искал учебники по этому предмету, но в принципе ничего не нашел, кажется, что он в первую очередь предназначен для iCloud, который я не использую. Похоже, что это для создания документа, но я просто вытаскиваю единый объект из базы данных SQL Data Core, у меня нет документа как такового. Боюсь, я не уверен, как это связано с тем, что я делаю. – Luke

+0

UIManagedDocument предназначен не только для iCloud. Он предоставляет «предварительно построенный» основной стек данных: основной MOC с собственным родителем MOC, работающим на фоновом потоке. –

+0

Я понятия не имею, что такое MOC, этот комментарий был намного выше моей головы. Мне не удалось найти какую-либо документацию или учебники для нее, которые не ужасно запутывают - потребовалось бы переписывать весь мой код Core Data для его реализации? – Luke

0

1) В случае сохранения одного изменения логического значения принимают 200 мс?

Да, это может занять это долго. Вы выполняете операцию ввода-вывода, и в соответствии с documentation:

Когда ядро ​​данных сохраняет SQLite магазин, SQLite обновления только часть файла хранилища. Потеря частичного обновления будет катастрофичной, поэтому вы можете убедиться, что файл написан правильно до того, как ваше приложение будет продолжено. К сожалению, это означает, что в некоторых ситуациях сохранение даже небольшого набора изменений в хранилище SQLite может занять значительно больше времени, чем сохранение, скажем, хранилища XML.

-

2) я делаю что-то неправильно в коде, чтобы сделать метод принять это долго, чтобы выполнить?

No. вы делаете сохранения в хранилище (в предположении, у вас нет родительского контекста).

-

3) Являются 200мс достаточно для меня, по крайней мере, попытаться решить эту проблему?

Да. 200 мс являются заметным временем для человека и будут ощущаться. вы можете попробовать и выполнить сохранение в фоновом режиме, но это небезопасно в соответствии с documentation. или, переместите его в конец всего редактирования объекта.

Моей рекомендацией было бы прочитать и посмотреть, можете ли вы сделать некоторые компромиссы в своей контекстной архитектуре (структура стека CoreData).
Из моего опыта сохранение на заднем плане не так уж плохо.