带有 NSFetchedResultsControllers 的 NSError 对象

Posted

技术标签:

【中文标题】带有 NSFetchedResultsControllers 的 NSError 对象【英文标题】:NSError objects with NSFetchedResultsControllers 【发布时间】:2013-03-26 18:11:38 【问题描述】:

这是一个简单的问题:我目前正在创建一个新的NSError 对象,每次我对我的NSFetchedResultsController 执行提取。这发生在许多方法中,因此我的主视图控制器中目前有九个方法。我应该创建一个NSError 作为属性并使用它,还是更习惯地接受每次使用时创建一个新属性?

我猜测创建多个错误的好处是,如果发生多个错误,您可以独立处理两个错误,但如果这不太可能发生,是否可以为所有 performFetch 调用使用共享错误?我正在学习很多编程约定和技术,如果这不是问题,我很抱歉,我只是想获得一些关于在各种地方使用NSError 对象的更典型方法的反馈。

【问题讨论】:

【参考方案1】:

您并没有真正创建 NSError 对象。您正在声明对 NSError 对象的引用,然后将引用传递给一个方法,该方法可能会将引用指向它创建的 NSError 对象。

NSError *err; // just a reference, no object created
// this creates an object, but you don't do this
err = [NSError errorWithDomain:@"foo" code:0 userInfo:nil];

// You do this.... 
BOOL success = [fetchedResultsController performFetch:&err];

区别在于,您实际上并没有创建一堆需要开销的对象。因此,如果您对所有变量重复使用相同的变量,或者为每个变量创建一个新变量,则不会影响性能。

所以要回答这个问题......要么使用 1 个变量,要么使用许多你认为合适的变量。某些代码可能会因任何错误而失败并拒绝继续,因此 1 个错误就可以了。其他代码可能想要尝试并继续运行,这样您就可以保留所有错误并在最后将它们喷出。这是最适合您当时正在处理的特定编码的问题。

【讨论】:

【参考方案2】:

只需在堆栈上声明一个并传递它的地址实际上是免费的。所以你可以这样做:

NSError *errorA;

// do something, passing &errorA
if (!errorA) 
    // do something passing &errorA again

或者,几乎没有任何额外成本(只是堆栈上的另一个指针)

NSError *errorA, *errorB;

// do something, passing &errorA
// do something, passing &errorB, that doesn't care whether the last thing succeeded

if (!errorA && !errorB) 
    // do something else

这里无需担心 NSError 的分配问题。应该更多的是第一个动作成功和做第二个动作之间的依赖逻辑。

【讨论】:

以上是关于带有 NSFetchedResultsControllers 的 NSError 对象的主要内容,如果未能解决你的问题,请参考以下文章

在 Swift 3 中难以配置 NSFetchedResultsController

如何根据计算的属性过滤来自 NSFetchedResultsController 的结果?

为啥 beginUpdates/endUpdates 会重置表视图位置以及如何阻止它这样做?

带有多个链接的 NSAttributedString 的 UILabel,带有行限制,显示尾部截断,带有未见文本的 NSBackgroundColorAttributeName

使用带有 uuencode 的“sendmail”发送邮件,并带有主题

带有和不带有聚合的 sql 查询