gpt4 book ai didi

ios - refreshcontrol 结束刷新必须等待子类

转载 作者:行者123 更新时间:2023-11-29 13:08:14 25 4
gpt4 key购买 nike

我为我的 tableview 实现了一个 refreshcontrol,它工作正常。但我想实现调用另一个类在该类中执行进程。我希望我的 refreshcontrol 应该等到那个类的执行。

例如:我在 Player 类中进行了一些数据库更改。现在 refreshcontrol 在数据库更改正在进行时结束刷新。

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

最佳答案

与其让 pullToRefresh 方法等待更新,不如在更新过程中简单地使用完成 block 会更好,这样 pullToRefresh 就可以告诉更新处理更新完成后要做什么。

例如,不是让 initWithProfile 执行更新过程,您可以有一些方法,比如 performUpdateWithCompletion 来执行它,但给它一个完成 block :

- (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];
}

还有其他方法(委托(delegate)模式、通知模式),但我更喜欢基于 block 的解决方案的内联即时性。


顺便说一句,如果 UpdOther 使用 NSURLConnectionDataDelegate 方法,您显然需要从其他方法调用 completionBlock(例如, connectionDidFinishLoading)。因此,在那种情况下,您将在 UpdOther 中定义一个 block 属性,如下所示:

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

或者,您可以为这个 block 定义一个 typedef:

typedef void (^UpdateCompletionBlock)(void);

然后在您的属性(property)声明中使用它:

@property (nonatomic, copy) UpdateCompletionBlock updateCompletionBlock;

无论如何,在这种情况下,您的performUpdateWithCompletion 将在该属性中保存该 block 的副本:

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

// now initiate time consuming asynchronous update here
}

然后,无论您如何完成下载,您都可以在那里调用保存的完成 block :

- (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();
});
}
}

关于ios - refreshcontrol 结束刷新必须等待子类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18057228/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com