更新模型中数据更新的视图控制器

时间:2015-03-27 19:26:19

标签: ios

如何在不使用通知,代理或KVO的情况下通知视图控制器模型中的新更新?我在接受采访时被问到是否可以使用块来通知我的视图控制器更新?能否请您举例说明我将如何使用块来做到这一点?

2 个答案:

答案 0 :(得分:1)

关于您要询问的主题(在委派,通知,观察和块之间进行选择),有很多讨论。我将看看我是否可以快速总结为什么以及如何快速使用块:

当只有一个或两个事件告诉观察者/调用对象时,你会使用一个块。 iOS库中的一个示例位于NSURLSessionDataTask类中 - 它有一个方法:

- (NSURLSessionDataTask *)dataTaskWithRequest:(NSURLRequest *)request completionHandler:(void (^)(NSData *data, NSURLResponse *response, NSError *error))completionHandler

由于网络调用可能发生的事情数量有限(成功通过或失败),因此使用了一个块。

另一方面,当有许多不同的事件通知观察者/代表时,您可以使用委托。一个很好的例子是UITextField - iOS中的文本字段可以开始编辑,结束编辑,更改字段中的字符,清除,返回等等。用所有的方法重载块都没有多大意义。不同的选择。因此,使用委托,以便委托可以选择它关心/更新的事件,并跳过其他事件。

要在模型上使用此功能,您可以使用如下所示的模型方法,例如:

- (void) saveObject:(NSObject*)object completionHandler:(void (^) (BOOL success, NSError *error))completionHandler

这将更新您传入的对象,然后在完成时运行您传入的块。在该块中,您可以访问成功标志以及可能的错误。您可以直接从视图控制器调用它,并使用在所述视图控制器中定义的变量。

整个辩论更像是一种艺术形式,而不是一种精确的科学。如果您想了解更多相关信息,请随时查看以下内容:

http://stablekernel.com/blog/blocks-or-delegates/ http://blog.shinetech.com/2011/06/14/delegation-notification-and-observation/

答案 1 :(得分:0)

ReactiveCocoa是另一种可能的解决方案。 ReactiveCocoa是一种流行的框架,其工作方式与KVO类似,但使用的是块。

在一个简单的例子中查看github页面上的介绍部分:

https://github.com/ReactiveCocoa/ReactiveCocoa#introduction

还有一些关于这个主题的好教程:

http://www.raywenderlich.com/62699/reactivecocoa-tutorial-pt1