1

Имея небольшую проблему с работой AFNetworking и представлением коллекции. Я использую AFNetworking, чтобы позвонить в API фотографий Foursquare. Я создаю URL-адрес фотографии, полученный мне из Foursquare, и сохраняю этот URL-адрес в realm.io. Затем я вызываю URL-адреса из четырех областей и использую эти URL-адреса в методе setImageWithURL AFNetworking в моем представлении коллекции cellForItemAtIndexPath. Когда диспетчер представлений, что вещь выполняется в первоначально нагрузках, кажется, на мгновение блокирует основной поток (около 1 секунды), пока изображения не начнут отображаться в моем представлении коллекции. Я не уверен, почему и задавался вопросом, есть ли у кого-нибудь предложение улучшить производительность? Заранее спасибо!AFNetworking и Collection View Blocking Main Thread

Вот мой код ниже cellForItemAtIndexPath:

- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath { 
static NSString *identifier = @"photoCell"; 

UICollectionViewCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:identifier forIndexPath:indexPath]; 
UIImageView *wineryImageView = (UIImageView *)[cell viewWithTag:100]; 

_photo = [_wineryPhotosArray objectAtIndex:indexPath.row]; 

[wineryImageView setImageWithURL:[NSURL URLWithString:_photo.photoURLString] placeholderImage:[UIImage imageNamed:@"Grapes"]]; 

return cell; 
} 

_wineryPhotosArray моя область массив, содержащий фотографии URL, из Foursquare. Кроме того, я попробовал обернуть метод setImageWithURL в dispatch_async(dispatch_get_main_que), но это, похоже, не сильно повлияло.

Это мой код для моего Foursquare Фото API вызова, который затем сохраняет URL-адреса в области:

-(void)getFoursquarePhotos { 

FoursquarePhotosAPI *foursquarePhotoAPI = [FoursquarePhotosAPI initWithClientSecret:_clientSecret clientID:_clientId venueId:_venueId]; 

[foursquarePhotoAPI foursquarePhotosAPI:^(NSDictionary *data) { 

    for (NSDictionary *foursquarePhotos in data) { 

     _photo = [Photo initWithPrefix:[foursquarePhotos valueForKey:@"prefix"] size:[NSString stringWithFormat:@"%@x%@", [foursquarePhotos valueForKey:@"height"], [foursquarePhotos valueForKey:@"width"]] suffix:[foursquarePhotos valueForKey:@"suffix"]wineryId:_venueId]; 

     RLMRealm *realm = [RLMRealm defaultRealm]; 
     [realm beginWriteTransaction]; 
     [realm addOrUpdateObject:_photo]; 
     [realm commitWriteTransaction]; 
     [self.collectionView reloadData]; 
    } 
    }]; 
} 
+1

Вы можете использовать stackshot, чтобы увидеть, что происходит, пока оно застыло, и профайлер времени (в Инструментах), чтобы понять, почему он так долго. –

+1

Вы также можете попытаться переместить 'beginWriteTransaction',' commitWriteTransaction' и 'reloadData' вне цикла' for', поэтому вы не совершаете много транзакций, и вы только перезагружаете данные один раз, когда это будет сделано. Вы также можете попробовать выполнить операции в области фонового потока, а затем перезагрузить представление коллекции в основном потоке, когда это будет сделано. –

+0

Спасибо, что перемещение области пишет и перезагружает данные вне цикла for, казалось, помогло. Я думаю, что это мгновенно замедлило его. – dcotter

ответ

0

Аарон, безусловно, верно, что тянет beginWriteTransaction и commitWriteTransaction из для цикла должно улучшить производительность. Главным правилом Realm's большого пальца является попытка и пакетное количество операций записи в одной транзакции записи, насколько это возможно.

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

Изображения не декодируется в момент вызова [UIImageView setImage:], но лениво загружены на Core Animation в то время, что точка зрения о том, чтобы быть оказаны ГПУ (Так герметизирующего этот код в dispatch_async ничего не делать).

Согласно this Stack Overflow answer, AFNetworking в UIImage скачать категория довольно голые кости, и не выполняет это фоновое изображение декодирования себя, но он предлагает несколько решений, которые, например, AFImageRequestOperation или SDWebImage.

Для получения дополнительной информации о конвейере декодирования/рендеринга изображения iOS, я бы рекомендовал вам посмотреть видео WWDC 2014: Расширенная графика и анимация для iOS-приложений. :)

+0

Спасибо за дополнительную информацию @TiM. Я буду смотреть видео WWDC. Еще немного нового для всего этого, но надеясь, что это обеспечит меня более глубоким пониманием. – dcotter