0

現在、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 全体をリロードしたかったのです。したがって、基本的には、ブロックが完了した後にリロードを呼び出したいと考えています。どうすればそうできますか?

4

3 に答える 3

3

これを行う1つの方法は、

[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
            }
        }];
    }
于 2013-01-16T18:34:39.723 に答える
1

メソッドがディスパッチ キューやNSOperationQueue実行するブロック引数を要求せず、ドキュメントにも特に記載されていない場合は、通常、ブロックが同期的に実行されると想定できます。ブロックは並列処理を意味するものではありません。ドキュメントでは、ブロックが実際にいつ非同期で実行されるかがわかります。

NSNotificationCenterのブロック オブザーバー メソッドは、ブロックを非同期的に実行するメソッドの例です。そしてそのインスタンスでは、NSOperationQueue.

于 2013-01-17T01:55:55.827 に答える
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];
    }
于 2013-01-16T19:12:50.567 に答える