gpt4 book ai didi

ios - 如果核心数据计数/获取请求中的实体名称错误,如何避免崩溃?

转载 作者:可可西里 更新时间:2023-11-01 01:09:06 29 4
gpt4 key购买 nike

我正在为我所有的持久性存储类编写一个通用基类。每个子类将使用核心数据在持久数据库中处理一个特定的实体/表。线程似乎工作正常,我可以正确获取表中的项目数。问题是如果获取请求中的实体名称是错误的,我不会得到异常,我会崩溃。由于这是一个字符串并且由程序员在代码中的某处键入,我想以某种更好的方式检测错误,以便提醒程序员使用了无效的实体名称。

这是我的代码:

class Store<EntityType:NSFetchRequestResult> : NSObject {
private var entityName : String = ""
init( entityName : String ) {
self.entityName = entityName
}

public var Count : Int
{
get {
var fetchResults : Int = 0
objc_sync_enter( self )
do {

var privateContext : NSManagedObjectContext? = nil
DispatchQueue.main.sync {
let deleg = UIApplication.shared.delegate as! AppDelegate
privateContext = deleg.privateManagedObjectContext
}

if privateContext == nil
{ return 0 }

privateContext!.performAndWait {
do
{
let request = NSFetchRequest<EntityType>( entityName: self.entityName )
fetchResults = try privateContext!.count( for: request )
} catch
{
print("Unexpected error: \(error).")
}
}
}
objc_sync_exit( self )
return fetchResults
}
}
...

对于错误的实体名称,MOC 上的 count() 函数会导致 SIGABRT 并且不会抛出任何异常。

我如何以某种方式捕获错误?

我也愿意接受有关线程和在后台线程中使用它的评论。它现在可以工作,但由于互联网和 Apple 都对如何在后台线程中使用 Core Data 含糊其词,因此不胜感激。

我刚才也试过了:

let request = NSFetchRequest<EntityType>( entityName: String(reflecting: EntityType.self) )

名称的格式为“app name.entityname”,因此可能会用到。但是由于编辑器允许程序员为实体和类输入不同的名称,所以这一点都不安全。如果我能以某种方式在运行时检查名称是否有效,我将使用此方法。但是在不解决崩溃问题的情况下,我现在不愿意更改任何内容。

最佳答案

可以获取上下文模型中存在的实体名称列表。

有了它,您可以在执行获取请求之前检查程序员提供的实体名称是否有效。

//get the context and make sure it's not nil
guard let privateContext = privateContext
else {
print("Unexpected error: context is nil.")
return 0
}

//get the names of entities in the model associated with this context
// credit: Snowman, https://stackoverflow.com/questions/5997586/core-data-list-entity-names
guard let names = privateContext.persistentStoreCoordinator?.managedObjectModel.entities.map({ (entity) -> String? in
return entity.name
})
else {
print("Unexpected error: Could not get entity names from model.")
return 0
}

//make sure the name specified by the programmer exists in the model
guard names.contains(where: { (name) -> Bool in
return name == self.entityName
})
else {
print("Unexpected error: \(self.entityName) does not exist in the model.")
return 0
}

privateContext.performAndWait {
do
{
let request = NSFetchRequest<EntityType>( entityName: self.entityName )
fetchResults = try privateContext.count( for: request )
} catch
{
print("Unexpected error: \(error).")
}
}

如果您想了解性能:在我的测试中,为包含 20 个实体的模型检索实体名称列表 500 次需要 20 毫秒。不用担心。

关于ios - 如果核心数据计数/获取请求中的实体名称错误,如何避免崩溃?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49544612/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com