UITableView和UICollectionView重新加载将无法在主线程上正常工作

时间:2015-11-10 19:42:24

标签: ios objective-c uitableview uicollectionview

我一直在努力解决这个问题,这让我发疯了。 我在我的应用程序的不同viewControllers中有一些tableView和collectionView,它们似乎都有同样的问题。问题是,当我使用[tableView/collectionView reloadData]重新加载它们时,即使我已经检查过 - 使用下面的代码 - 我知道应用程序没有在后台运行,但数据也不会加载到表或集合中。

UIApplicationState state = [[UIApplication sharedApplication] applicationState];
if (state == UIApplicationStateBackground || state == UIApplicationStateInactive)
{
    NSLog(@"app is running in background");
}

我搜索了解决方案,正如其中一个建议我做的如下:

dispatch_async(dispatch_get_main_queue(), ^{
    [self reload];
});

-(void)reload{
    NSMutableArray *indexPaths = [[NSMutableArray alloc] init];
    NSIndexPath *indexPath;
    for (int i = 0; i < [self.guestsArray count]; i++) {
        indexPath = [NSIndexPath indexPathForItem:i inSection:0];
        [indexPaths addObject:indexPath];
    }
    [self.collectionView reloadItemsAtIndexPaths:indexPaths];
}

通过这样做,collectionView重新加载但是indexpath 0处的单元格在storyBoard中保持相同的原型单元格,直到我滚动它。 这是单元格的代码:

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

    NSString *imageStr = contDict[@"small_image"];
    NSURL *url = [NSURL URLWithString:imageStr];
    NSData *imageData = [NSData dataWithContentsOfURL:url];
    UIImageView *uiimg = (UIImageView *)[cell viewWithTag:1];
    [[NSOperationQueue mainQueue] addOperationWithBlock:^{

        uiimg.clipsToBounds=YES;
        uiimg.layer.cornerRadius = uiimg.bounds.size.width/2.0f;
        [uiimg setImage:[UIImage imageWithData:imageData]];

    }];
    UIImageView *imageView2 = (UIImageView *)[cell viewWithTag:3];
    UIImage *img = [UIImage imageNamed:@"tik.png"];
    [imageView2 setImage:img];

    return cell;
}

1 个答案:

答案 0 :(得分:1)

在cellForItemAtIndexPath中,mainQueue将该块添加到主线程的操作队列,但不保证何时执行。该队列中可能还有其他项目仍在等待执行。你需要那块吗?我不认为这是必要的。此外,当人们谈论“后台线程”时,他们并不暗示你的应用程序是背景的,他们说你正在一个没有阻止UI的线程上工作。这意味着UIApplicationState肯定不是你在这里寻找的东西。我会保持

dispatch_async(dispatch_get_main_queue(), ^{
    [self reload];
});

你应该能够在reload方法体内调用reloadData。