目前我正在执行以下操作来迭代NSMutableIndexSet:
if ([indexSet isNotNull] && [indexSet count] > 0){
__weak PNRHighlightViewController *weakSelf = self;
[indexSet enumerateIndexesUsingBlock:^(NSUInteger idx, BOOL *stop) {
if ([[self.highlightedItems_ objectAtIndex:idx] isNotNull]){
NSIndexPath *indexPath = [NSIndexPath indexPathForRow:idx inSection: [weakSelf.collectionView numberOfSections]-1];
[weakSelf.collectionView reloadItemsAtIndexPaths:[NSArray arrayWithObject:indexPath]];
}
}];
}
我想生成一个NSIndexPath数组,然后在那些索引路径重新加载整个collectionView。所以基本上我想在块完成后调用重新加载。我怎么能这样做?
答案 0 :(得分:2)
这样做的一种方法是,
[indexSet enumerateIndexesUsingBlock:^(NSUInteger idx, BOOL *stop) {
if ([[self.highlightedItems_ objectAtIndex:idx] isNotNull]){
NSIndexPath *indexPath = [NSIndexPath indexPathForRow:idx inSection: [weakSelf.collectionView numberOfSections]-1];
//store the indexPaths in an array or so
}
if (([indexSet count] - 1) == idx) { //or ([self.highlightedItems_ count] - 1)
//reload the collection view using the above array
}
}];
}
答案 1 :(得分:1)
如果方法没有要求调度队列或NSOperationQueue
来运行块参数,并且文档没有另外说明,则通常可以假设它同步执行块。块并不意味着并行性,文档将告诉您何时块实际上是异步运行。
NSNotificationCenter
的块观察器方法将是异步执行块的方法的示例。在那个例子中,它要求NSOperationQueue
。
答案 2 :(得分:0)
在块中构建数组。迭代是同步执行的(所以你不真的需要担心自我弱):
if ([indexSet isNotNull] && [indexSet count] > 0){
__weak PNRHighlightViewController *weakSelf = self;
NSMutableArray *indexPaths = [NSMutableArray new]; // Create your array
[indexSet enumerateIndexesUsingBlock:^(NSUInteger idx, BOOL *stop) {
if ([[self.highlightedItems_ objectAtIndex:idx] isNotNull]){
NSIndexPath *indexPath = [NSIndexPath indexPathForRow:idx inSection: [weakSelf.collectionView numberOfSections]-1];
[indexPaths addObject:indexPath];
}
}];
[self.collectionView reloadItemsAtIndexPaths:indexPaths];
}