Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c KVC如何处理速度和错误?_Objective C_Cocoa_Properties_Kvc - Fatal编程技术网

Objective c KVC如何处理速度和错误?

Objective c KVC如何处理速度和错误?,objective-c,cocoa,properties,kvc,Objective C,Cocoa,Properties,Kvc,我一直在阅读有关KVC和Cocoa脚本的内容,以及如何使用属性来实现这一点。我心中有一个模型类,但元素/属性数据必须从互联网上获得。但是属性和KVC的设计似乎假设了快速的内存检索,而网络调用可能很慢和/或容易出错。如何协调这些问题 对于速度,我们是否只是说去死吧,然后贴一个等待图标?当然,我们应该让事情多线程化,这样UI就不会在我们等待时停止 如果您的属性应该始终可用,那么如果资源调用出错,我们可以将其设置为nil。但我们无法了解具体情况。更糟糕的是,如果属性支持缺少的值,那么nil将表示这一点

我一直在阅读有关KVC和Cocoa脚本的内容,以及如何使用属性来实现这一点。我心中有一个模型类,但元素/属性数据必须从互联网上获得。但是属性和KVC的设计似乎假设了快速的内存检索,而网络调用可能很慢和/或容易出错。如何协调这些问题

对于速度,我们是否只是说去死吧,然后贴一个等待图标?当然,我们应该让事情多线程化,这样UI就不会在我们等待时停止

如果您的属性应该始终可用,那么如果资源调用出错,我们可以将其设置为nil。但我们无法了解具体情况。更糟糕的是,如果属性支持缺少的值,那么nil将表示这一点,并且我们将没有备用状态用于错误

尽管Apple events支持错误处理,但我无法使用它,因为在我潜在的错误生成模型调用和Apple事件之间,KVC层会将错误抛到遗忘的地板上。脚本桥API看到了这个问题,因为它的设计者添加了一个秘密协议来处理错误

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

附录


我忘了提到例外情况。Objto-C现在支持它们,但是我读到的关于它们的含义意味着它们是灾难性的,而不是直接崩溃使用,而不是像C++那样的常规错误处理。除此之外,它们在这里可能很有用……

我想我理解你现在的要求。我想说,使用KVC或属性getter并不是完成您要做的事情的好方法。如果代码在主线程上被调用,那么您将阻塞该线程。这是你不想做的。正如您所发现的,您还很难返回其他状态信息,例如错误

相反,您应该使用块语法来创建在后台队列上操作的异步方法。下面是一个基本的模板,它可能是什么样子的:

// 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);
                            }

                        });
                   });
}
这还使您能够传入所需的任意多个其他参数,并在完成块中返回所需的任意多个值


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

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