使用继承。
我有一个子类,它调用运行的父类中的方法调用服务器API。
-(IBAction)buttonPressed
{
[self methodInParentClassThatCallsTheAPI:param];
// This is where I would like the call back
if (success from the server API) // do something with the UI
else if (failure from the server API) // do so something else with the UI
}
父类:
- (void)methodInParentClassThatCallsTheAPI:(NSString *)param
{
//The method below calls the server API and waits for a response.
[someServerOperation setCompletionBlockWithSuccess:^(param, param){
// Return a success flag to the Child class that called this method
} failure:^(param, NSError *error){
// Return a failure flag to the Child class that called this method
}
}
如何用块来完成这个?除了块之外,还有更好的方法吗?代码示例
答案 0 :(得分:4)
在methodInParentClass
上创建一个完成块,如下所示:
- (void)methodInParentClassThatCallsTheAPI:(NSString *)param completionBlock:(void (^)(BOOL success))completionBlock;
然后使用适当的值在块成功/失败中触发它:
completionBlock(YES);
编辑:顺便提一下,请注意返回可能不在主线程上,因此如果您计划进行UI更新,则可以使用dispatch_async(dispatch_get_main_queue,^ {})触发返回块;
EDIT2:因为您似乎建议这是按钮点击的结果,如果您的孩子是等待返回的VC,请记住此块将返回异步(显然,因为它的设计目的是什么)因此,如果您因任何原因需要保留用户,您需要让主线程显示某种加载指示符并保留用户输入事件。请记住,如果你没有在完成模块开始之前UI继续响应,那么至少你会想要禁用该按钮,这样用户就不能多按它然后你可以重新启用当完成块从孩子VC开火时。
EDIT3:好的,这是调用代码。
-(IBAction)buttonPressed
{
[self methodInParentClassThatCallsTheAPI:param withCompletionBlock:^(BOOL success){
if (success) {
// do something with the UI
} else {
// Do something else
}
}];
}