Имея небольшую проблему с работой 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];
}
}];
}
Вы можете использовать stackshot, чтобы увидеть, что происходит, пока оно застыло, и профайлер времени (в Инструментах), чтобы понять, почему он так долго. –
Вы также можете попытаться переместить 'beginWriteTransaction',' commitWriteTransaction' и 'reloadData' вне цикла' for', поэтому вы не совершаете много транзакций, и вы только перезагружаете данные один раз, когда это будет сделано. Вы также можете попробовать выполнить операции в области фонового потока, а затем перезагрузить представление коллекции в основном потоке, когда это будет сделано. –
Спасибо, что перемещение области пишет и перезагружает данные вне цикла for, казалось, помогло. Я думаю, что это мгновенно замедлило его. – dcotter