メソッドに更新を待機させるより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
を呼び出す必要があることは明らかです。したがって、その場合、次のようにブロック プロパティを定義します。completionBlock
connectionDidFinishLoading
UpdOther
@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();
});
}
}