我一直在努力解决这个问题,这让我发疯了。
我在我的应用程序的不同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;
}
答案 0 :(得分:1)
在cellForItemAtIndexPath中,mainQueue将该块添加到主线程的操作队列,但不保证何时执行。该队列中可能还有其他项目仍在等待执行。你需要那块吗?我不认为这是必要的。此外,当人们谈论“后台线程”时,他们并不暗示你的应用程序是背景的,他们说你正在一个没有阻止UI的线程上工作。这意味着UIApplicationState肯定不是你在这里寻找的东西。我会保持
dispatch_async(dispatch_get_main_queue(), ^{
[self reload];
});
你应该能够在reload方法体内调用reloadData。