Вместо того, в 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();
});
}
}