簡體   English   中英

調用reloadData時,UICollectionView不會立即更新,而是在30-60秒后隨機更新

[英]UICollectionView doesn't update immediately when calling reloadData, but randomly after 30-60 seconds

正如標題所暗示的那樣,我的UICollectionView在調用reloadData后不會立即更新並顯示單元格。 相反,它似乎最終在30-60秒后更新我的集合視圖。 我的設置如下:

UICollectionView加入與兩個故事板,以查看控制器delegatedataSource設置為視圖控制器和標准出口設置numberOfSectionsInRowcellForItemAtIndexPath都實現並引用試制的電池和imageView在它的內部

以下是轉到Twitter的代碼,獲取時間軸,將其分配給變量,使用推文重新加載表格視圖,然后通過推文查找照片並使用這些項目重新加載集合視圖。

即使我注釋掉顯示圖像的代碼,它仍然不會改變任何東西。

SLRequest *timelineRequest = [SLRequest requestForServiceType:SLServiceTypeTwitter requestMethod:SLRequestMethodGET URL:timelineURL parameters:timelineParams];
[timelineRequest performRequestWithHandler:^(NSData *responseData, NSHTTPURLResponse *urlResponse, NSError *error) {
    if(responseData) {
        JSONDecoder *decoder = [[JSONDecoder alloc] init];

        NSArray *timeline = [decoder objectWithData:responseData];

        [self setTwitterTableData:timeline];

        for(NSDictionary *tweet in [self twitterTableData]) {
            if(![tweet valueForKeyPath:@"entities.media"]) { continue; }

            for(NSDictionary *photo in [[tweet objectForKey:@"entities"] objectForKey:@"media"]) {
                [[self photoStreamArray] addObject:[NSDictionary dictionaryWithObjectsAndKeys:
                                                    [photo objectForKey:@"media_url"], @"url",
                                                    [NSValue valueWithCGSize:CGSizeMake([[photo valueForKeyPath:@"sizes.large.w"] floatValue], [[photo valueForKeyPath:@"sizes.large.h"] floatValue])], @"size"
                                                    , nil]];
            }
        }

        [[self photoStreamCollectionView] reloadData];
    }
}];

這是從后台線程調用UIKit方法的經典症狀。 如果你查看-[SLRequest performRequestWithHandler:]文檔 ,它說處理程序不保證它將在哪個線程上運行。

在塊中包含對reloadData的調用並將其傳遞給dispatch_async() ; 還將dispatch_get_main_queue()作為隊列參數傳遞。

您需要將更新分派給主線程:

 dispatch_async(dispatch_get_main_queue(), ^{
    [self.photoStreamCollectionView reloadData];
  });

或者在Swift中:

dispatch_async(dispatch_get_main_queue(), {
    self.photoStreamCollectionView.reloadData()
})

Apple說:你不應該在插入或刪除項目的動畫塊中間調用此方法。 插入和刪除會自動使表的數據得到適當更新。

面對:你不應該在任何動畫的中間調用這個方法(在滾動中包含UICollectionView)。

所以你可以:

[self.collectionView setContentOffset:CGPointZero animated:NO];
[self.collectionView performSelectorOnMainThread:@selector(reloadData) withObject:nil waitUntilDone:NO];

或者確定沒有任何動畫,然后調用reloadData; 要么

[self.collectionView performBatchUpdates:^{
//insert, delete, reload, or move operations
} completion:nil];

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM