2013-05-07 69 views
3

這裏是爲大家的挑戰......UICollectionView需要很長的時間來刷新數據

我有一個UICollectionViewUIViewController女巫內部正確加載。 我也有一個自定義UICollectionViewCell職業女巫包含一個UIButton

我爲了一個背景圖像分配給我的自定義UICollectionViewCell的按鈕來檢索從我的一些UIImage對象服務器NSArray

這是我的cellForItemAtIndexPath函數的代碼:

- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath; 
{ 
    UserPhotoCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"userPhotoCell" forIndexPath:indexPath]; 

    if (indexPath.section == 0) { 
     [[cell imageButton] setBackgroundImage:[userPublicImages objectAtIndex:indexPath.row] forState:UIControlStateNormal]; 
    } else { 
     [[cell imageButton] setBackgroundImage:[userPrivateImages objectAtIndex:indexPath.row] forState:UIControlStateNormal]; 
    } 

    return cell; 
} 

正如你所看到的是很簡單的。

來了奇怪的行爲:如果我把我所有的自定義UICollectionViewCellUICollectionView只是一個部分,其性能是好的...

什麼想法?

一些額外的信息:UICollectionView有標題。自定義標題。此時此刻UIView就是UILabel

- (UICollectionReusableView *)collectionView:(UICollectionView *)collectionView viewForSupplementaryElementOfKind:(NSString *)kind atIndexPath:(NSIndexPath *)indexPath 
{ 
    UICollectionReusableView *reusableView = nil; 

    if (kind == UICollectionElementKindSectionHeader) { 
     UICollectionReusableView *headerView = [collectionView dequeueReusableSupplementaryViewOfKind:UICollectionElementKindSectionHeader withReuseIdentifier:@"collectionHeader" forIndexPath:indexPath]; 
     UILabel *titleLabel = [[UILabel alloc] initWithFrame:CGRectMake(0.0f, 0.0f, [headerView frame].size.width, 40.0f)]; 
     if (indexPath.section == 0) { 
      [titleLabel setText:NSLocalizedStringFromTable (@"collectionTitle_publicPhotos", [[NSLocale preferredLanguages] objectAtIndex:0] , @"")]; 
     } else { 
      [titleLabel setText:NSLocalizedStringFromTable (@"collectionTitle_privatePhotos", [[NSLocale preferredLanguages] objectAtIndex:0] , @"")]; 
     } 
     [headerView addSubview:titleLabel]; 

     reusableView = headerView; 
    } 

    return reusableView; 
} 
+0

您應該使用儀器和時間分析器來確定時間花在哪裏。 – 2013-05-07 12:59:16

+0

嗯,時間事件探查器說這個問題在這裏:UserPhotoCell * cell = [collectionView dequeueReusableCellWithReuseIdentifier:@「userPhotoCell」forIndexPath:indexPath]; ... reusableCell ...也許我應該包括「if(cell == nil)」 ? – 2013-05-07 13:11:23

回答

14

我想我找到了答案。由於一些奇怪的原因,[collectionView reloadData]沒有在主線程中被觸發。所以,我的解決方案如此簡單:

dispatch_async(dispatch_get_main_queue(), ^{ 
     [_collectionUserPhotos reloadData]; 
    }); 

現在,根據需要立即更新UICollectionView。

一些注意事項:在使用隊列後,此[collectionView reloadData]在自定義類中使用AFNetworking在委託方法中調用。希望能幫助到你。

+0

哇..真的很有幫助..真棒男人..感謝您的幫助... – 2013-10-30 06:53:45

+0

不客氣! – 2013-10-31 19:27:40

相關問題