【问题标题】:How does KVC deal with speed and errors?KVC 如何处理速度和错误?
【发布时间】:2014-06-24 20:13:16
【问题描述】:

我一直在阅读有关 KVC 和 Cocoa 脚本以及如何为此使用属性的文章。我有一个模型类,但元素/属性数据必须从 Internet 获得。但是属性和 KVC 的设计看起来像是假设快速和内存检索,而网络调用可能很慢和/或容易出错。这些如何调和?

为了速度,我们是否只是说“去他妈的”并发布一个等待图标? (当然,我们应该保持多线程,这样 UI 在我们等待时不会停止。)

如果您的属性应该始终可用,如果资源调用出错,我们可以将其设置为 nil。但是我们没有办法得到细节。更糟糕的是支持“缺失值”的属性,然后nil 将代表它,我们将没有备用状态用于错误。

虽然 Apple 事件支持错误处理,但我无法使用它,因为在我可能会产生错误的模型调用和 Apple 事件之间,KVC 层会将错误放到地板上(被遗忘)。 Scripting Bridge API 发现了这个问题,因为它的设计者添加了一个秘密协议来处理错误。

我错了吗?有没有办法处理基于 KVC 的设计的错误?

附录

我忘了提到例外。 Objective-C 现在支持它们,但我读到的关于它们的信息很少暗示它们是用于灾难性的“而不是直接崩溃”的,而不是用于像 C++ 中那样的常规错误处理。除此之外,它们可能在这里有用....

【问题讨论】:

  • 不太清楚你在问什么。 KVC 与网络有什么关系?
  • KVC 只是一种在对象上调用方法的方式。它并不特定于模型对象,因此您可以在这些方法中处理错误和网络,就像在其他任何地方一样。有趣的是 KVO 的东西,具有依赖的键路径等。
  • 具有特定类型签名的方法,即。
  • @Dima,我在问是否可以将 KVC 方法挂接到不会立即返回的代码中;它不是立即从内存中返回答案的方法,而是让调用者等待几秒钟的网络下载。
  • @stevesliva,我见过的 KVC/KVO 签名只处理结果,没有留下返回错误的方法。那么如果核心代码确实返回错误,丢弃错误并返回nil,会发生什么?

标签: objective-c cocoa properties kvc


【解决方案1】:

我想我明白你现在在问什么。我会说使用 KVC(或属性获取器)不是完成您想要做的事情的好方法。如果代码在主线程上被调用,您将阻塞该线程。你不想这样做。正如您所发现的,您也很难返回其他状态信息,例如错误。

相反,您应该使用块语法来创建在后台队列上运行的异步方法。这是一个基本模板:

// called from main thread
- (void) fetchDataInBackgroundWithCompletionHandler:(void (^)(id responseData, NSError *error))handler
{
    // perform in background
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^()
                   {
                        // perform your background operation here

                        // call completion block on main thread
                        dispatch_async(dispatch_get_main_queue(), ^{
                            if(// whatever your error case is)
                            {
                                handler(nil, error);
                            }
                            else // success
                            {
                                handler(responseData, nil);
                            }

                        });
                   });
}

这还使您能够传入尽可能多的其他参数,并在完成块中返回尽可能多的值。

可以在AFNetworking 中看到这种模式的一些非常好的示例,这是为 iOS 编写的更流行的网络库之一。库中的所有调用都可以从主队列进行,并在后台执行所有网络时异步返回主队列。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-06-05
    • 2013-11-24
    • 1970-01-01
    • 2017-05-03
    • 2017-05-25
    • 2017-05-17
    • 1970-01-01
    相关资源
    最近更新 更多