Fetch Request 执行方法returns 无

Fetch Request execution method returns nothing

在我的应用程序中,我使用 Core Data 来保存有关用户的一些基本信息并轻松获取数据,我创建了一个 Assistant class,它具有一些静态函数。其中之一如下:

static func fetchData(forEntity name: String) -> AnyObject{

        var result: AnyObject!

        let dataController = DataController().managedObjectContext
        let fetchRequest = NSFetchRequest(entityName: name)

        do{
            result = try dataController.executeFetchRequest(fetchRequest)
        }catch{
            print("Failed to execute fetch request for \(name) entity")
        }
        print("Returning result: \(result.description)")

        return result
    }

问题是当我使用它时 print("Returning result: \(result.description)") 打印 "Returning result: ()" 但它不是零,我认为它只是一个空的 AnyObject。无论如何,如果我在这种方法中使用它:

static func getName() -> String{

        let fetched = fetchData(forEntity: "UserData") as! [UserData]

        if fetched.count > 0{
            print("Returning found value: \(fetched.first!.username!)")
            return fetched.first!.username!
        }else{
            print("Did not find any data, returning an empty string")
            return ""
        }

    }

它returns 一个空字符串。但是,如果我在另一个 class:

中使用以下方法
func initialize(){

        do{
            let fetch = NSFetchRequest(entityName: "UserData")
            let entities = try dataController.executeFetchRequest(fetch) as! [UserData]
            if entities.count > 0{
                dispatch_async(dispatch_get_main_queue(), {self.fld_name.text = entities[0].username})
            }else{
                dispatch_async(dispatch_get_main_queue(), {self.fld_name.text = ""})
            }
        }catch{
            print("Nope, nothing's here")
        }

    }

它运行良好,数据读取正确。 以下是您需要了解的内容:我在 AppDelegateapplication(application:, didFinishLaunchingWithOptions launchOptions:) 方法中使用了 getName() 方法。所以可能是 CoreData 在那一刻不能正常工作(我严重怀疑)

好的,这是我的假设:

  1. 可能是由于返回 AnyObject 导致我丢失所有数据而出现此问题?
  2. 可能是因为此时 CoreData 尚未(以某种方式)激活?
  3. 这只是我犯的其他愚蠢错误吗?

请提出您的解决方案。提前致谢!

您有一些问题可能会导致麻烦。首先,我将重写您的 fetchData 函数。

static func fetchData(forEntity name: String) -> [AnyObject] {

    let dataController = DataController().managedObjectContext
    let fetchRequest = NSFetchRequest(entityName: name)

    do{
        let results = try dataController.executeFetchRequest(fetchRequest)
        print("Returning result: \(results.description)")
        return results
    } catch {
        print("Failed to execute fetch request for \(name) entity")
        return []
    }
}

exexuteFetchRequest 的 return 类型是 AnyObjectArray 类型,而不只是一个。

对于您的 getName() 函数,我将执行以下操作。它使用 if let 绑定来安全地处理您的结果。

static func getName() -> String {

    if let 
        fetched = fetchData(forEntity: "UserData") as? [UserData],
        userData = fetched.first,
        username = userData.username {
        print("Returning found value: \(username)")
        return username  
    } else {
        print("Did not find any data, returning an empty string")
        return ""
    }
}

试一试,看看是否有帮助。至少,这段代码要安全得多,如果出现任何问题,崩溃的可能性也小得多。

问题是每次我需要获取数据时,我都在创建一个新的 DataController().managedObjectContext 实例,并且不知何故在没有任何异常的情况下逃脱了。我的解决方案(有效)是将一个实例放入委托中并使用它。它起作用了,但是,正如我所说,我不知道为什么它以这种方式起作用而在其他情况下却不起作用。很抱歉我的无知,但我很高兴我刚刚修复了它,如果你能给我一个解释,我想得到一个解释。