gpt4 book ai didi

ios - 使用 MVVM 和 ReactiveCocoa,如何处理 iOS 中的委托(delegate)模式?

转载 作者:行者123 更新时间:2023-12-01 18:10:33 26 4
gpt4 key购买 nike

一个常见的情况是有一个 View Controller A ,它有一些信息将被发送到 View Controller B ;和 B将编辑信息,当B完成信息编辑,B将调用委托(delegate)方法更新A ,并从导航 Controller 中弹出自身。

如何用 MVVM 和 ReactiveCocoa 处理这个问题?

最佳答案

一般来说,大量使用 ReactiveCocoa 会让你远离委托(delegate)模式。但是,由于您已经编写的大部分代码以及您将在 iOS 标准库中遇到的所有代码都使用它,因此能够与之交互仍然很重要。

您需要使用 -[NSObject rac_signalForSelector:]类别,这将返回一个接收 RACTuple 的信号每次调用方法时参数的值,并在发送信号的对象被释放时完成。

假设您有一个 UIViewController显示包含用户可以选择的复选框列表,底部有一个继续按钮。由于选择随时间而变化,您可以将其表示为 RACSignalNSIndexSet值(value)观。就本示例而言,假设您必须按原样使用此类,并且它当前声明了一个委托(delegate)模式,其中包含以下内容:

@class BSSelectionListViewController;
@protocol BSSelectionListViewControllerDelegate <NSObject>
- (void)listChangedSelections:(BSSelectionListViewController*)list;
- (void)listContinueTouched:(BSSelectionListViewController*)list;
@end

当您从其他地方展示 View Controller 时(如导航堆栈顶部的 UIViewController),您将创建 View Controller 并将 self 指定为委托(delegate)。它可能看起来像
BSSelectionListViewController* listVC = [[BSSelectionListViewController alloc] initWithQuestion:question listChoices:choices selections:idxSet];
listVC.delegate = self;
[self.navigationController pushViewController:listVC];

推本前 UIViewController在堆栈上,您需要为它可以调用的委托(delegate)方法创建信号:
RACSignal* continueTouched = [[[self rac_signalForSelector:@selector(listContinueTouched:)]
takeUntil:list.rac_willDeallocSignal]
filter:^BOOL(RACTuple* vcTuple)
{
return vcTuple.first == listVC;
}];

RACSignal* selections = [[[[self rac_signalForSelector:@selector(listChangedSelections:)]
takeUntil:list.rac_willDeallocSignal]
filter:^BOOL(RACTuple* vcTuple)
{
return vcTuple.first == listVC;
}]
map:^id(RACTuple* vcTuple)
{
return [vcTuple.first selections];
}];

然后,您可以订阅这些信号来执行您需要的任何副作用。也许是这样的:
RAC(self, firstChoiceSelected) = [selections map:^id(NSIndexSet* selections)
{
return @([selections containsIndex:0]);
}];


@weakify(self)
[continueTouched subscribeNext:^(id x)
{
@strongify(self)
[self.navigationController popToViewController:self];
}];

因为您可能有几个这样的屏幕是您的代表,所以您要确保在 RACSignals 中过滤到仅此一个。

ReactiveCocoa 实际上会为您实现这些方法(委托(delegate)协议(protocol)中的方法)。但是,为了让编译器满意,您应该添加 stub 。
- (void)listChangedSelections:(BSSelectionListViewController *)list {}
- (void)listContinueTouched:(BSSelectionListViewController*)list {}

这是,IMO,对标准委托(delegate)模式的改进,您需要声明一个实例变量来保存选择 View Controller ,并检查哪个 Controller 正在调用您的委托(delegate)方法。 ReactiveCocoa 的 rac_signalForSelector方法可以将该状态的范围(这个 View Controller 随着时间的推移而变化)缩小到一个局部变量而不是一个实例变量。它还允许您明确处理对选择的更改。

关于ios - 使用 MVVM 和 ReactiveCocoa,如何处理 iOS 中的委托(delegate)模式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32282374/

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