0

dataLoadingForChallenges という名前のメソッドがあります。その中で、必要に応じて別の 2 つのメソッドを呼び出しています。クラスでこのメソッドを 2 ~ 3 回使用して、さまざまなイベントを処理しています。1 つのイベントでは、このメソッドを cellForRowAtIndexPath メソッドで非同期的に呼び出したいと考えています。以下のコードは受け入れられますか。dataLoadingForChallenges のすべてのコードをこの GCD ブロックに貼り付けたくありません。GCD ブロックから再利用可能なメソッドを呼び出す方法は何ですか。

dispatch_queue_t q = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0ul);
            dispatch_async(q, ^{
            [self dataLoadingForChallenges];
                 });
4

1 に答える 1

1

その 1 つのメソッド呼び出し、または 2 つの大きな 1 回の呼び出しを、所有するブロックにカプセル化できます。そうすれば、ディスパッチ ブロックはややきれいになり、いつでもブロックを開始できます。

typedef void (^DataLoadBlock)();

@interface MyClass ()

@property (nonatomic, copy) DataLoadBlock dataLoadBlock;

@end

- (id)init {
    self = [super init];

    //Avoid a retain cycle with blocks that we own referencing self
    __weak id weakSelf = self;
    _dataLoadBlock = ^{
        id blockSelf = weakSelf;
        [blockSelf dataLoadingForChallenges];
        //Or put your other two messages, or even the bodies of those methods in the block.
    };
    return self;
}

- (void)loadData {
    dispatch_queue_t q = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0ul);
    dispatch_async(q, self.dataLoadBlock);
}
于 2013-03-28T06:43:41.637 に答える