目标C中的回调

时间:2014-09-30 18:15:02

标签: objective-c asynchronous callback

我有两节课。 ClassA,有两种方法,MethodAMethodBClassBMethodC

我希望ClassA.MethodA调用ClassB.MethodC(它将在后台异步运行),当ClassB.MethodC完成时,它会触发回调以调用ClassA.MethodB(以及一些参数传回来。)

我该怎么做?

感谢。

2 个答案:

答案 0 :(得分:1)

如果MethodC强烈连接到methodB,我会发送带完成块的参数:

ClassA的

- (void)methodC {
    void(^blockName)(parameterTypes) = ^void(parameters) {
        // The code that should be done after methodB finish.
    };
    [self.instanceOfClassA:blockName];
}

ClassB的

- (void)methodB:(void(^)(parameterTypes))blockName {
   // Do what you need to here in method B.
   blockName(parameters);
}

您也可以使用委托或ReactiveCocoa解决此类问题。 RACSignal是管理不同类之间流控制的一种非常好的方法。

答案 1 :(得分:1)

  1. 可以像这样声明method_C: - (oneway void)mothod_C。它将被称为async

  2. 您可以使用dispatch_async和完成块。对我来说不舒服。

    MethodA
    {
        dispatch_async(dispatch_get_main_queue(),
        ^{
            MethodC_withComplition:
            ^{
                weak_classA.MethodB
            }
        })
    }
    
  3. 可以使用[ClassB performSelectorInBackground:@selector(MethodC)withObject:@ [callingThread,callbackSelector]] 或同等学历 [NSThread detachNewThreadSelector:@selector(methodC :) toTarget:classB withObject:@ [callingThread,callbackSelector]]并在调用此任务的线程上使用callbackSelector。

  4. 使用带有ClassB的NSInvocationOperation和带参数回调的选择器MethodC,并推送到操作队列。在MethodC结束时使用[ClassA performSelectorOnMainThread:@selector(callbackSelector :)]

  5. 如果可能的话,用简单的回调为你介绍这个后台任务(NSOperation的子类)的操作。

  6. 至于我,最好使用NSOperation子类 - 变体4.当然,如果它适用于你的情况。