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方法,或者我是否需要在块中包装此方法调用?
从逻辑上讲,您需要三条信息来调用所描述的选择器.对象实例,选择器的名称和字典参数.
您传递的块在调用时只接受一条信息 - 字典.其他所有东西都需要在街区内捕获.
因此,从逻辑上讲,选择器不能直接替换块.除了其他任何东西,知道哪个实例调用它来自何处?
生成"此特定对象上的此方法"记录并将其压缩为单个对象的唯一方法是将其放入块中.
如果你想要调用一个已定义的方法格式(在这种情况下,只有一个参数),并且隐式地知道该对象,那么你可以考虑传入一个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; 这很难看,你很快就会开始理解为什么闭包被添加到语言中了.
| 归档时间: |
|
| 查看次数: |
109 次 |
| 最近记录: |