[英]uicollectionview select an item immediately after reloaddata?
[英]UICollectionView doesn't update immediately when calling reloadData, but randomly after 30-60 seconds
正如標題所暗示的那樣,我的UICollectionView
在調用reloadData
后不會立即更新並顯示單元格。 相反,它似乎最終在30-60秒后更新我的集合視圖。 我的設置如下:
UICollectionView
加入與兩個故事板,以查看控制器delegate
和dataSource
設置為視圖控制器和標准出口設置numberOfSectionsInRow
& cellForItemAtIndexPath
都實現並引用試制的電池和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.