模型和控制器之间的通信-iOS

模型和控制器之间的通信-iOS,ios,model-view-controller,rest,nsnotificationcenter,Ios,Model View Controller,Rest,Nsnotificationcenter,我对iOS开发还不熟悉,所以我希望得到一些反馈 我正在尝试为我的web服务构建一个iOS客户端。到目前为止,我所做的就是: 我正在实现两个视图(使用故事板的基于实用程序的应用程序)。在主视图中,我使用一个文本字段和一个搜索按钮,用户可以在其中输入查询,然后单击搜索按钮。单击搜索按钮后,我的目的是读取文本字段的值,并在对web服务的Restful调用中使用它。我的web服务使用带有查询结果的JSON文件进行回复,我解析该文件并将其显示到第二视图的文本区域 我知道如何在iOS中进行restful调用

我对iOS开发还不熟悉,所以我希望得到一些反馈

我正在尝试为我的web服务构建一个iOS客户端。到目前为止,我所做的就是:

我正在实现两个视图(使用故事板的基于实用程序的应用程序)。在主视图中,我使用一个文本字段和一个搜索按钮,用户可以在其中输入查询,然后单击搜索按钮。单击搜索按钮后,我的目的是读取文本字段的值,并在对web服务的Restful调用中使用它。我的web服务使用带有查询结果的JSON文件进行回复,我解析该文件并将其显示到第二视图的文本区域

我知道如何在iOS中进行restful调用,以及如何进行JSON解析以及在屏幕上显示结果(至少是文本内容,但这是另一个不同的问题)。但我的目的是学习MVC基础知识并将其应用到我的应用程序中

根据MVC,控制器更新视图,模型发送通知广播,控制器可以收听并知道对象中是否有任何更改。这就是我理想中想要做的:

我的模型——我的模型将处理核心RESTful调用,获取JSON回复,解析它,并获取我想要在视图上显示的结果值

我的控制器-我想让我的控制器听我的模型,从模型中获得结果值,并在视图中显示它们

使用一种快速而肮脏的方式,我可以实现RESTful调用、JSON解析和显示结果值——所有这些都在控制器内部,但是使用这种技术,如果我的视图明天更改,那么我必须重新编写代码。或者,如果我想添加新功能,那么我必须更改控制器。所以理想情况下,我希望有一个核心模型,它不知道视图是什么样子,让控制器从模型中获取结果,并在视图中显示它们

从目前为止我从谷歌搜索结果中看到的情况来看,有两种方法可以做到这一点:a)关键值观察和b)通知中心

在过去的两天里,我一直在试图找到一个很好的方法来实现NotificationCenter,或者阅读更多关于它的信息,我没有得到一个好的线索。我的一些问题是,我可以使用控制器拾取的通知中心发送字符串结果值吗?Notification Center如何处理字符串值?我在哪里可以找到一些好的例子

因此,任何有关这方面的帮助都将非常感谢

我的一些问题是,我可以发送字符串结果吗 使用控制器拾取的通知中心的值

是的,这通常使用
NSNotification
userInfo
属性来完成
userInfo
是一个普通的
NSDictionary
,它可能包含
NSObject
派生对象的实例,这些对象由遵循
NSCopying
协议的键索引(通常使用
NSString
)。请注意,字典(
userInfo
)将保留您的参数对象


Notification Center如何处理字符串值

好吧,这取决于你希望它如何工作。但撇开吹毛求疵不谈,见下文


我在哪里可以找到一些好的例子

也许这个有帮助


示例

接收方(控制器)注册通知:

- (void)registerForNotifications
{
    [[NSNotificationCenter defaultCenter] addObserver:self 
                                             selector:@selector(modelObjectUpdatedString:)
                                                 name:@"StringUpdated"
                                               object:nil];
}
发送者(模型)通知世界:

- (void)stringUpdateWith:(NSString *)theString
{
    self.string = theString;
    [[[NSNotificationCenter defaultCenter] postNotificationName:@"StringUpdated" 
                                                         object:self 
                                                       userInfo:[NSDictionary dictionaryWithObjectsAndKeys:self.string, @"String", nil]];
}
接收方(控制器)在其处理程序中接收通知:

- (void)modelObjectUpdatedString:(NSNotification *)notification
{
    ModelObject *postingObject = [notification object];
    NSString *string = [[notification userInfo]
        objectForKey:@"String"];
    ...
}

你的思路是正确的,但仍然不是完全正确的。正如Till在他的评论中所指出的,您不应该处理模型内部的RESTful通信。如果我是您,我将创建一个实用程序类,负责获取信息,然后创建一个负责保存数据的类(最后一个类是您的模型)

创建一个类方法来分配和启动这个对象的一个新实例是明智的,它是从通过RESTful communicator类获取的JSON数据创建的

从控制器的角度来看:

RESTHelper *rest = [RESTHelper restHelperWithURL:yourRESTURL];
YourModel *model = [YourModel modelWithJSON:[rest fetchObjectWithID:1]];
// Present your models data in the view.

您可能会从使用CoreData中获益,我强烈建议您对此进行研究。

您真的希望您的模型能够处理与RESTful服务的通信吗?这是一个完美的答案。非常感谢您提供了一个清晰简洁的答案。这正是我想要的。这里有好的建议。谢谢你给我指引了正确的方向。这些是我希望得到的反馈,因为我是iOS开发新手,我希望在做任何复杂的应用程序之前掌握好基本知识。除非你遇到块、KVO或委派无法完成工作的情况,否则你不应该使用NSNotificationCenter。嗨,拉斯穆斯,我也在学习iOS。(OO并不陌生)。然后,您会建议restHelper类在获得一些数据后“回调”模型上的协议吗?您能解释一下为什么使用[rest fetchObjectWithID:1]吗?我知道我在斯坦福大学的视频中看到过,但似乎我已经摧毁了那些脑细胞。。。