gpt4 book ai didi

objective-c - 如何创建一个 'wraps' 目标/选择器对的 block ?

转载 作者:太空狗 更新时间:2023-10-30 03:27:54 24 4
gpt4 key购买 nike

我喜欢积木,它们非常酷。

但是,我发现如果不在 Xcode 中折叠所有代码(我不喜欢这样做),代码块会使我的代码变得杂乱无章并且难以阅读。

我喜欢将我的代码拆分为逻辑方法(选择器)以使其更易于阅读,但(从表面上看)这对于 dispatch、AFNetworking 和其他几个框架来说似乎不太可能。

我也不喜欢委托(delegate)方法,因为这意味着我不能按照自己的意愿命名我的方法,而是依赖于其他人认为我需要的东西。

因此,无需像这样编写一堆粘合代码:

-(void) reloadData { 
...
[[EventsManager instance] data:YES async:^(NSArray *events) { [self processEvents:events] }];
...
}

我可以改为这样做:

-(void) reloadData {
...
[[EventsManager instance] data:YES async:createBlock(self, @selector(processEvents:))];
...
}

哪个更容易阅读(对我来说)。

凭借我们在 objective-c 和它的运行时方面的强大功能,这应该是可能的,不是吗?不过,我还没有见过这样的东西。

最佳答案

从学术的角度来看,我喜欢你的回答; +1,很明显,您学到了一些东西。

从实际的角度来看,这似乎增加了非常多的脆弱性,几乎没有减少打字,同时它还会导致调用站点的一些信息丢失。

这样做的好处是它是完全明确的:

-(void) reloadData { 
...
[[EventsManager instance] data:YES async:^(NSArray *events) { [self processEvents:events] }];
...
}

读到这里,您会发现需要异步回调 block 来处理参数,并且 self 上的 processEvents: 方法将用于执行实际工作。

表达式 createBlock(self, @selector(processEvents:)) 是相同的有损表示;它丢失了回调的显式论证以及该论证与被调用方法之间的映射(我经常看到像上面这样的带有多个参数的回调 block ,其中在调用方法之前有一些轻量级逻辑和/或参数处理)。

另请注意,在调用时将非可变参数调用站点处理为可变参数违反了 C 标准,并且不适用于具有特定参数列表的某些 ABI。

关于objective-c - 如何创建一个 'wraps' 目标/选择器对的 block ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16256362/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com