2014-02-12 5 views
1

у меня есть этот код, чтобы управлять CollectionViewIOS: numberOfSectionsInCollectionView сообщение отправлено высвобождены, например

- (NSInteger)numberOfSectionsInCollectionView:(UICollectionView *)collectionView 
{ 
    return 1; 
} 

- (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section 
{ 
    return [images count]; 
} 

- (PhotoCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath{ 

    PhotoCell *cell = [gridPhoto dequeueReusableCellWithReuseIdentifier:@"photocell" forIndexPath:indexPath]; 

    NSMutableDictionary *record = [images objectAtIndex:[indexPath row]]; 
    if ([record valueForKey:@"actualImage"]) { 
     [cell.image setImage:[record valueForKey:@"actualImage"]]; 
     [cell.activity stopAnimating]; 
    } else { 
     dispatch_async(imageQueue_, ^{ 
      NSData *imageData = [NSData dataWithContentsOfURL:[NSURL URLWithString:[record objectForKey:@"url"]]]; 
      dispatch_async(dispatch_get_main_queue(), ^{ 
       [record setValue:[UIImage imageWithData:imageData] forKey:@"actualImage"]; 
       [collectionView reloadItemsAtIndexPaths:[NSArray arrayWithObject:indexPath]]; 
      }); 
     }); 
    } 

    return cell; 
} 

Он работает хорошо, если imageQueue_ закончить свою работу и заполнить всю CollectionView; У меня есть проблема, когда я выйти из моего зрения, призывающих заднего

- (IBAction)back:(id)sender{ 
    [self.navigationController popViewControllerAnimated:YES]; 
} 

В этом случае, если CollectionView не вся заселены образов у ​​меня есть эта ошибка, когда я делаю обратное действие:

[PhotoGalleryViewController numberOfSectionsInCollectionView:]: message sent to deallocated instance 0x1590aab0 

где это проблема?

+0

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

ответ

1

Загрузка по-прежнему выполняется, когда вы открываете свой контроллер. Поэтому, когда выполняется асинхронный обратный вызов, ваш [collectionView reloadItemsAtIndexPaths...] вызывается на collectionView, который больше не существует.

Вы должны проверить, что collectionView != nil на первой строке вашего обратного вызова блока, а просто return;, если это ноль:

dispatch_async(dispatch_get_main_queue(), ^{ 
    if (collectionView == nil) 
     return; 

    [record setValue:[UIImage imageWithData:imageData] forKey:@"actualImage"]; 
    [collectionView reloadItemsAtIndexPaths:[NSArray arrayWithObject:indexPath]]; 
}); 
+0

и где я установил тиковый контроль? внутри "dispatch_async (dispatch_get_main_queue(), ^"? – CrazyDev

+0

Прямо перед [запись setValue: [UIImage imageWithData: imageData] forKey: @ "actualImage"]; [collectionView reloadItemsAtIndexPaths: [NSArray arrayWithObject: indexPath]]; –

+0

это не узнайте collectionview == nil, но я решил установить значение bool в true, когда я нажимаю назад, и я устанавливаю условие, если этот bool является истинным, где вы говорите мне, теперь он работает нормально, и я могу выйти и войти в этот контроллер представления каждый раз без проблем – CrazyDev

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