块/方法可以互换吗?

spe*_*der 2 objective-c ios objective-c-blocks

我来自C#/ Java/JS到objectiveC,我只有几天了,所以对我很轻松.

...所以我有一个方法,将一个块作为参数:

-(void)subToPub: (NSString*)publisherName 
      channelId: (NSString*)channelId 
       callback: (void(^)(NSDictionary*))cb
Run Code Online (Sandbox Code Playgroud)

我通常会使用如下:

[myObj  subToPub:@"someId" 
       channelId:@"someOtherId" 
        callback:[(^(NSDictionary* msg){
                    NSLog(@"cb2: %@",msg);
                 }) copy]
];
Run Code Online (Sandbox Code Playgroud)

现在,假设我有另一种兼容签名的方法,例如:

-(void)subscribeHandler:(NSDictionary*)msg{
    NSLog(@"cb2: %@",msg);
}
Run Code Online (Sandbox Code Playgroud)

是否可以将此作为回调传递给上面的subToPub方法,或者我是否需要在块中包装此方法调用?

Tom*_*mmy 6

从逻辑上讲,您需要三条信息来调用所描述的选择器.对象实例,选择器的名称和字典参数.

您传递的块在调用时只接受一条信息 - 字典.其他所有东西都需要在街区内捕获.

因此,从逻辑上讲,选择器不能直接替换块.除了其他任何东西,知道哪个实例调用它来自何处?

生成"此特定对象上的此方法"记录并将其压缩为单个对象的唯一方法是将其放入块中.

如果你想要调用一个已定义的方法格式(在这种情况下,只有一个参数),并且隐式地知道该对象,那么你可以考虑传入一个selector(SEL).所以,例如

[myObj  subToPub:@"someId" 
       channelId:@"someOtherId" 
        callback:@selector(subscribeHandler:)
];
Run Code Online (Sandbox Code Playgroud)

...然后,假设您知道要与之交谈的对象,obj并将SEL您收到的内容存储为selector:

[obj performSelector:selector withObject:msg];
Run Code Online (Sandbox Code Playgroud)

如果你想传递多个参数,那么你需要开始愚弄NSInvocations; 这很难看,你很快就会开始理解为什么闭包被添加到语言中了.