gpt4 book ai didi

ios - 构建应用程序以使用带有 ReactiveCocoa 的 ViewModel

转载 作者:可可西里 更新时间:2023-11-01 06:23:15 25 4
gpt4 key购买 nike

我开始使用 ReactiveCocoa。简单的东西说得通,复杂的我还做不到。 ;)

这就是我要建模的内容:我有一个 View Controller ,它显示从 HTTP 端点请求的一些数据。 HTTP 端点使用带有 cookie 的类似浏览器的基本身份验证。

所以,我想发出 HTTP 请求。如果成功,很好,显示数据。如果失败并显示 401,我需要告诉 View 弹出一个模态对话框询问用户名/密码,然后重试 HTTP 请求。

那么,在我的 ViewModel 中,我有两个信号吗?一个返回内容,另一个告诉 View 层我需要凭据?如何将凭据返回到 HTTP 请求发生的位置?

最佳答案

您的 ViewModel 使应用程序的模型适应它的 View 。换句话说,它维护 View 需要显示的任何状态(以可绑定(bind)属性的形式)并公开 API 以更新该状态并执行应用程序的“工作”(以普通旧方法的形式)。所以,从你写的内容来看:

"I have a view controller that displays some data requested from an HTTP endpoint."

这听起来像是开始,您的 ViewModel 应该有某种方式将此数据表示为状态。这几乎总是可以通过 Objective-C 属性来完成:

@interface MyViewModel : NSObject
@property (nonatomic, strong) NSArray *tableData;
// (Or whatever makes sense for your view.)
@property (nonatomic) BOOL needCredentials;
@end

然后,您的 View Controller 应绑定(bind)到这些属性,以便每当属性更改时(例如,每当检索到新数据或收到 401 错误时),相应的 UIViews 都会更新。请注意您的 ViewModel 的 API 甚至没有任何 ReactiveCocoa 代码。那是因为如果你的 View Controller 有对 ViewModel 对象的引用, View Controller 可以使用 ReactiveCocoa 以任何有意义的方式绑定(bind)到 ViewModel。例如,在更简单的情况下,您可以只使用 RAC(self, infoView.name) = RACObserve(self, myViewModel.infoViewName);。在更复杂的情况下,例如实现 UITableViewDelegate,您需要实现 UITableViewDataSource 方法,但这是相同的想法。要显示询问用户名和密码的模态对话框,您甚至可以使用类似

- (void)viewDidLoad
{
self.myViewModel = [[ViewModel alloc] init];
@weakify(self);
[[RACObserve(self, myViewModel.needCredentials) ignore:@NO] subscribeNext:^(id _) {
@strongify(self);
[self displayModalDialog];
}];
}

"So, I want to make that HTTP request. If it succeeds, great, display the data. If it fails with a 401, I need to tell the view to pop up a modal dialog asking for the username/password, and then retry the HTTP request."

您的 ViewModel 可以有一个方法,例如 - (void)sendRequest:(NSDictionary *)parameters。从您的 View Controller 调用此方法可能如下所示:

- (IBAction)handleButtonTap:(id)sender
{
NSDictionary *parameters = [self makeParametersFromTextFields];
[self.myViewModel sendRequest:parameters];
}

再次注意:ViewModel 的 API 中不需要 ReactiveCocoa 代码。这并不是说您不应该使用 RAC,只是说 ViewModel 的 API 不一定依赖于信号或任何 ReactiveCocoa 概念——它只是一个模型对象专门用于为您的应用程序中的特定 View 提供服务。在 ViewModel 的方法实现中,您可能会在所有地方使用信号,或者您可能正在使用一些更命令的 API,如 NSOperationQueues 或其他东西。这并不重要,只要您的 ViewModel 通过 KVO 可观察属性向 View 公开数据(以便您的 View Controller 可以绑定(bind)到这些属性,这通常使用 ReactiveCocoa 完成)。

那么您的-sendRequest: 方法如何处理这个参数字典?我不知道。那部分取决于你。如果得到有效响应,您应该更新 ViewModel 上的某些属性(例如,上面代码片段中的 tableData 属性)。如果它收到 401,它应该更新 ViewModel 上的一些其他属性(例如,将 needCredentials 属性设置为 YES)。已经将自身绑定(bind)到这些属性的 View Controller 将以您配置的任何方式使用react。

"In my ViewModel, then, do I have two signals? One that returns the content, and another which tells the view layer that I need the credentials? How do I get the credentials back down to where the HTTP request happens?"

我希望至此我已经回答了问题。 ViewModel 不需要任何 信号。它只需要支持 KVO 的属性。正如上面在 -handleButtonTap: 方法示例中所演示的,您无需执行任何特殊操作即可将凭据获取到 HTTP 请求发生的位置 - 只需调用 ViewModel 上的方法,然后传递在任何有意义的数据中。 (当然,ViewModel 必须知道向哪个对象提供凭据才能启动 HTTP 请求并处理响应,但这部分应该非常学术。)

关于ios - 构建应用程序以使用带有 ReactiveCocoa 的 ViewModel,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20808988/

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