2012-04-15 43 views
6

我是iOS开发新手,所以我希望得到一些反馈。模型和控制器之间的通信 - iOS

我想为我的web服务构建一个iOS客户端。到目前为止,这是我所做的:

我正在实现两个视图(使用故事板的基于实用程序的应用程序)。在主视图中,我使用文本字段和搜索按钮,用户可以在其中输入查询,然后单击搜索按钮。点击搜索按钮后,我的意图是读取文本字段的值,并在我的Web服务的Restful调用中使用它。我的网络服务回复一个带有查询结果的JSON文件,我将其解析并显示到辅助视图的文本区域。我知道如何做iOS中的restful调用,以及如何做JSON解析以及在屏幕上显示结果(至少文本的东西,但这是另一个不同的问题)。但我的意图是学习和实现MVC基础到我的应用程序。

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

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

我的控制器 - 我想我的控制器听我的模型,并从模型中获得结果值,并将其显示在视图上。

使用一个快速和肮脏的方式,我可以实现基于REST调用,JSON解析和显示结果值 - 所有的控制器里面,但这种技术,如果我的看法改变了,明天,我要重新写我的代码。或者如果我想添加新功能,那么我必须更换我的控制器。因此,理想情况下,我希望拥有一个不知道View如何看起来像的核心Model,并让Controller从Model获取结果并将其显示在View上。

从我迄今为止从Google搜索结果中读取的信息来看,这样做的两种方法是a)重要价值观察和b)通知中心。

对于最近2天,我试图找到一个很好的方式来实现通知中心或阅读更多关于它,我没有得到一个好的领导。我的一些问题是,我可以使用通知中心发送字符串结果值,我的控制器会提取?通知中心如何真正处理字符串值?我在哪里可以找到一些很好的例子?

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

+1

你真的希望你的MODEL处理与RESTful服务的通信吗? – Till 2012-04-15 23:12:09

回答

12

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

是的,通常使用userInfo属性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"]; 
    ... 
} 
+2

这是一个完美的答案。非常感谢您提供清晰简洁的答案。这正是我所期待的。 – BlueChips23 2012-04-16 00:12:55

4

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

创建一个类方法来分配和启动从通过REST风格的通信器类获取的JSON数据创建的此对象的新实例是很聪明的。

从视图控制器点:

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

您可能会受益于这里使用CoreData,我强烈建议您考虑这样做。

+0

好的提示在这里。感谢您指导我正确的方向。这些都是我希望得到的反馈,因为我是iOS开发新手,我想在做任何复杂的应用程序之前就掌握基本知识。 – BlueChips23 2012-04-16 00:14:58

+0

除非遇到块,KVO或委派不能执行此任务的情况,否则不应使用NSNotificationCenter。 – 2012-04-16 23:00:57

+0

嗨Rasmus,我也正在与IOS交手。 (对于OO来说并不新鲜)。那么你会建议restHelper类在模型的协议上“回调”,一旦它获得了一些数据?你能解释为什么你使用[rest fetchObjectWithID:1]?我知道我在斯坦福大学的视频中遇到过它,但似乎我摧毁了这些脑细胞...... – Greycon 2013-01-21 20:53:44

相关问题