Приложение замедляется при попытке закодировать UIImage и сохранить его в NSUserdefault - PullRequest
1 голос
/ 02 ноября 2011

Я пытаюсь сохранить список пользователей (со свойством UIImage) в NSUserdefault всякий раз, когда пользователь нажимает на определенную вкладку в моем приложении.

В моем объекте 'user' я реализовал кодировку, как показано ниже:

- (void)encodeWithCoder:(NSCoder *)encoder
{
    NSURL *url = [NSURL URLWithString:self.avatar_url];
    NSData *data = [NSData dataWithContentsOfURL:url];
    self.avatar = [[[UIImage alloc] initWithData:data] autorelease];

    [encoder encodeObject:UIImagePNGRepresentation(self.avatar) forKey:@"avatar"];
}

Однако я понимаю, что после этого мое приложение зависает после нажатия на вкладку, которая запускает сохранение в NSUserdefault. Я приписываю низкую производительность преобразованию (и кодированию) UIImage из URL.

Есть ли способ ускорить этот процесс кодирования и сохранения изображения в NSUserdefault (это не вызывает отставание приложения).

Ответы [ 2 ]

3 голосов
/ 02 ноября 2011

Причина, по которой он работает медленно, заключается в том, что вы блокируете основной поток до загрузки изображения.Всякий раз, когда вы выполняете операции, основанные на сетевой активности, вы должны переместить это в фоновый поток.И, как указал @Richard J. Rosss III, вы можете сохранять данные напрямую, поэтому нет особых оснований для преобразования в изображение, а затем обратно в данные, если вам абсолютно не нужен png и исходный формат не был png.

Руководство по программированию параллелизма

1 голос
/ 02 ноября 2011

Если URL-адрес является удаленным (а не локальным file:/// URL-адресом), то проблема с производительностью, вероятно, связана с его загрузкой - рассмотрите использование NSURLRequest и связанных классов для асинхронной загрузки аватара (в фоновом режиме), а затемсохраните его в NSUserDefaults впоследствии.

Также обратите внимание, что запись изображения в NSUserDefaults не является предполагаемым вариантом использования - вам лучше записать его в файл в каталоге документов:

NSString *path = [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject] stringByAppendingPathComponent:@"avatar"];
[data writeToFile:path atomically:YES];

И для получения:

NSData *data = [NSData dataWithContentsOfFile:path];
UIImage *image = [UIImage imageWithData:data];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...