在没有块的情况下迭代NSMutableIndexSet

时间:2013-01-16 18:28:10

标签: iphone ios objective-c ipad

目前我正在执行以下操作来迭代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。所以基本上我想在块完成后调用重新加载。我怎么能这样做?

3 个答案:

答案 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];
    }