不必爲更新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];
}
還有其它的方法,也(委託模式,通知模式),但我更喜歡基於塊的溶膠的在線即時性ution。
順便說一句,如果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();
});
}
}
來源
2013-08-05 14:38:23
Rob