1

テーブルビューにリフレッシュコントロールを実装しましたが、正常に動作します。しかし、別のクラスを呼び出して、そのクラス内でプロセスを実行したいと考えています。そのクラスが実行されるまで、refreshcontrol を待機する必要があります。

例: Player クラスにいくつかのデータベースの変更があります。現在、refreshcontrol は、データベースの変更が進行中に更新を終了します。

-(void)pullToRefresh{
    UpdOther *updO = [[UpdOther alloc] initWithProfile:@"Player"];
    [updO release];
    [refreshControl endRefreshing];
}
4

1 に答える 1

1

メソッドに更新を待機させるよりpullToRefreshも、更新プロセスで完了ブロックを使用するだけで、更新pullToRefreshが完了したときに何をすべきかを更新プロセスに伝えることができます。

たとえばinitWithProfile、更新プロセスを実行するのではなく、何らかのメソッドをperformUpdateWithCompletion実行して、完了ブロックを与えることができます。

- (void)performUpdateWithCompletion:(void (^)(void))completionBlock
{
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{

        // do synchronous update here

        // when done, perform the `completionBlock`

        if (completionBlock) {
            dispatch_async(dispatch_get_main_queue(), ^{
                completionBlock();
            });
        }
    });
}

次に、pullToRefresh完了時に更新プロセスで実行することを指定できます。たとえば、次のようになります。

- (void)pullToRefresh{
    UpdOther *updO = [[UpdOther alloc] initWithProfile:@"Player"];
    __weak typeof(self) weakSelf = self;
    [updO performUpdateWithCompletion:^{
        typeof(self) strongSelf = weakSelf;
        [strongSelf.refreshControl endRefreshing];
    }];
    [updO release];
}

他のアプローチ (デリゲート パターン、通知パターン) もありますが、私はブロック ベースのソリューションのインラインの即時性を好みます。


ところで、がメソッドUpdOtherを使用している場合、他のメソッド (たとえば ) からNSURLConnectionDataDelegateを呼び出す必要があることは明らかです。したがって、その場合、次のようにブロック プロパティを定義します。completionBlockconnectionDidFinishLoadingUpdOther

@property (nonatomic, copy) void (^updateCompletionBlock)(void);

typedefまたは、このブロックにを定義できます。

typedef void (^UpdateCompletionBlock)(void);

それをプロパティ宣言で使用します。

@property (nonatomic, copy) UpdateCompletionBlock updateCompletionBlock;

とにかく、その場合、performUpdateWithCompletionそのプロパティにブロックのコピーを保存します:

- (void)performUpdateWithCompletion:(void (^)(void))completionBlock
{
    self.updateCompletionBlock = completionBlock;

    // now initiate time consuming asynchronous update here
}

そして、どのようにダウンロードを完了しても、そこに保存された完了ブロックを呼び出すことができます:

- (void)connectionDidFinishLoading:(NSURLConnection *)connection
{
    // do whatever extra steps you want when completing the update

    // now call the completion block

    if (self.updateCompletionBlock) {
        dispatch_async(dispatch_get_main_queue(), ^{
            self.updateCompletionBlock();
        });
    }
}
于 2013-08-05T14:38:23.997 に答える