Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 目标C中的回调_Objective C_Asynchronous_Callback - Fatal编程技术网

Objective c 目标C中的回调

Objective c 目标C中的回调,objective-c,asynchronous,callback,Objective C,Asynchronous,Callback,我有两节课ClassA,有两种方法,MethodA和MethodB。和ClassB,使用MethodC 我想让ClassA.MethodA调用ClassB.MethodC(它将在后台异步运行),当ClassB.MethodC完成时,它会触发一个回调来调用ClassA.MethodB(以及一些传递回来的参数) 我该怎么做 谢谢。如果MethodC与methodB强连接,我将发送带有完成块的参数: 甲级 B类 您还可以使用委托或ReactiveCocoa解决此类问题。RACSignal是管理不同类之

我有两节课
ClassA
,有两种方法,
MethodA
MethodB
。和
ClassB
,使用
MethodC

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

我该怎么做


谢谢。

如果MethodC与methodB强连接,我将发送带有完成块的参数:

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

  • 可以像这样声明方法C:-(单向无效)方法C,它将被称为异步

  • 您可以使用dispatch\u async和completion块。对我来说不舒服

    MethodA
    {
        dispatch_async(dispatch_get_main_queue(),
        ^{
            MethodC_withComplition:
            ^{
                weak_classA.MethodB
            }
        })
    }
    
  • 可以使用[ClassB PerformSelector InBackground:@selector(MethodC)with Object:@[CallingRead,callbackSelector]] 或同等品 [NSThread detachNewThreadSelector:@selector(methodC:)toTarget:classB with Object:@[CallingRead,callbackSelector]],并在调用此任务的线程上使用callbackSelector

  • 将NSInvocationOperation与ClassB一起使用,将selector MethodC与参数中的回调一起使用,然后推送到操作queque。在MethodC的末尾使用[ClassA performSelectorOnMainThread:@selector(callbackSelector:)]

  • 如果可能的话,通过简单的回调为这个后台任务(NSOperation的子类)引入您自己的操作


  • 对于我来说,最好使用NSOperation子类-变体4。当然,如果在您的情况下可用。

    感谢您的提示,我最终使用了代理。我甚至不知道有这样的事情(我对目标C是新手)。谢谢。最后使用了dispatch\u asynch
    - (void)methodB:(void(^)(parameterTypes))blockName {
       // Do what you need to here in method B.
       blockName(parameters);
    }
    
    MethodA
    {
        dispatch_async(dispatch_get_main_queue(),
        ^{
            MethodC_withComplition:
            ^{
                weak_classA.MethodB
            }
        })
    }