gpt4 book ai didi

ios - 是否可以将完成 block 传递给 Objective-C 中的委托(delegate)参数?

转载 作者:行者123 更新时间:2023-12-01 17:30:27 24 4
gpt4 key购买 nike

还是必须编写该方法才能接受 block ?换句话说,如果我们不控制定义该方法的代码,我们是否可以使用委托(delegate)(如果它是这样定义的),或者有没有办法在方法调用中传递两个匿名函数( block )期待代表?

最佳答案

从技术上讲,答案是否定的,如果某些库或类与代表一起使用,那么可能有充分的理由,并且更聪明、更容易做的事情就是使用它们。

如果由于某种原因您真的对使用 block 感兴趣,因为它对您的问题域更自然,您可以实现一个包装器。

前面 super 奇怪的例子。

例如,在 UITableViewDataSource委托(delegate)你有一个方法来获取每个部分的行数:

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section

为了使用它,您必须设置表 dataSource实现该方法的某个对象的属性。平常的东西。

您可以创建一个数据源包装器来实现原始协议(protocol)和一个您定义的新协议(protocol)以使用所需的 block 接口(interface)。
typedef NSUInteger (^RowsCounterBlock)(NSInteger section);

@protocol RowsCounter
- (void)tableViewController:(id)controller countRowsWithBlock:(RowsCounterBlock)block;
@end

// we implement both the original protocol and our block based protocol
@interface ComplexDataSource : NSObject <UITableViewDataSource, RowsCounter>
{
@property(strong) RowsCounterBlock counterBlock;
}

// save a block that knows how to count rows
- (void)tableViewController:(id)controller countRowsWithBlock:(RowsCounterBlock)block
{
controller.dataSource = self;
self.counterBlock = block;
}

// use the saved block to implement the method defined in the original delegate
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
if (!self.counterBlock) return 0;
return self.counterBlock(section);
}

@end

然后在您的表 Controller 中:
self.source = [ComplexDataSource new]; // save the data source in a property
[self.source tableViewController:self
countRowsWithBlock:^NSUInteger(NSInteger section) {
// this will be called each time the table view needs to ask
// for the number of rows via the proxy delegate
<#do your magic#>
return <#rows#>;
}]

答案仍然是否定的,因为您使用的是原始委托(delegate)……但在幕后,您的主界面现在是基于 block 的。

关于ios - 是否可以将完成 block 传递给 Objective-C 中的委托(delegate)参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26327531/

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