17

正如标题所暗示的那样, myUICollectionView不会在调用后立即更新和显示单元格reloadData。相反,它似乎最终会在 30-60 秒后更新我的收藏视图。我的设置如下:

UICollectionView添加到 Storyboard 中的视图控制器,delegatedataSource设置视图控制器和标准插座设置 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];
    }
}];
4

3 回答 3

42

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

将您的呼叫包装reloadData在一个块中并将其传递给dispatch_async(); dispatch_get_main_queue()也作为队列参数传递。

于 2013-02-11T00:46:22.837 回答
8

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

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

或在斯威夫特:

dispatch_async(dispatch_get_main_queue(), {
    self.photoStreamCollectionView.reloadData()
})
于 2015-10-14T01:00:24.967 回答
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];
于 2014-05-05T17:28:39.793 回答