iOS:等待API完成阻止并返回结果

时间:2014-05-07 01:46:09

标签: objective-c ios7 objective-c-blocks

使用继承。

我有一个子类,它调用运行的父类中的方法调用服务器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
      }
}

如何用块来完成这个?除了块之外,还有更好的方法吗?代码示例

1 个答案:

答案 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
        }
    }];
}