0

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

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

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

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

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

附录

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

4

1 回答 1

0

我想我明白你现在在问什么。我会说使用 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 编写的更流行的网络库之一。库中的所有调用都可以从主队列进行,并将在后台执行所有网络时异步返回主队列。

于 2014-06-30T18:17:48.460 回答