调用reloadData当UICollectionView不会立即更新,而是随机后30-60秒(UI

2019-07-19 16:42发布

正如标题所暗示的,我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];
    }
}];

Answer 1:

这是调用从后台线程的UIKit方法的典型症状。 如果您查看-[SLRequest performRequestWithHandler:]文档 ,它说的处理程序不保证该线程将被运行。

包装你调用reloadData一个块,并通过这dispatch_async() ; 还通过dispatch_get_main_queue()作为队列参数。



Answer 2:

您需要将更新分发到主线程:

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

或者斯威夫特:

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


Answer 3:

苹果说:你不应该叫在项目被插入或删除动画块的中间这种方法。 插入和缺失自动使表的数据进行适当的更新。

在脸:你不应该调用任何动画的中间这种方法(包括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];


文章来源: UICollectionView doesn't update immediately when calling reloadData, but randomly after 30-60 seconds