6

我是 iOS 开发的新手,所以我会很感激一些反馈。

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

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

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

根据MVC,控制器更新视图,模型发出通知广播,控制器可以收听并知道对象是否有任何变化。所以这就是我最想做的事情:

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

我的控制器 - 我希望我的控制器监听我的模型并从模型中获取结果值并将它们显示在视图上。

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

从到目前为止我从谷歌搜索结果中看到的内容来看,有两种方法是 a) 键值观察和 b) 通知中心。

在过去的 2 天里,我试图找到一种很好的方式来实施通知中心或阅读更多关于它的信息,但我没有得到很好的引导。我的一些问题是,我可以使用控制器获取的通知中心发送字符串结果值吗?通知中心如何真正使用字符串值?我在哪里可以找到一些好的例子?

因此,我们将不胜感激任何有关这方面的帮助。

4

2 回答 2

12

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

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


通知中心如何真正使用字符串值?

好吧,这取决于您希望它如何工作。但除了吹毛求疵,见下文。


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

也许这个有帮助...


例子

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

- (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"];
    ...
}
于 2012-04-15T23:37:43.097 回答
4

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

创建一个类方法来分配和启动该对象的一个​​新实例是很聪明的,该实例是从通过您的 RESTful 通信器类获取的 JSON 数据创建的。

从您的控制器的角度来看:

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

您可能会从这里使用 CoreData 中受益,我强烈建议您研究一下。

于 2012-04-15T23:43:41.523 回答