Fetch Request 执行方法不返回任何内容

Posted

技术标签:

【中文标题】Fetch Request 执行方法不返回任何内容【英文标题】:Fetch Request execution method returns nothing 【发布时间】:2015-12-29 13:57:55 【问题描述】:

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

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)") 打印“返回结果:()”并且它不是零,它只是一个空的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 ""
        

    

它返回一个空字符串。但是,如果我在另一个类中使用以下方法:

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 在那一刻不能正常工作(我严重怀疑)

好的,这是我的假设:

    是否会因为返回 AnyObject 而出现此问题,因此我会丢失所有数据? 可能是因为此时 CoreData 尚未(不知何故)激活? 这只是我犯的另一个愚蠢的错误吗?

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

【问题讨论】:

【参考方案1】:

您遇到了一些可能会导致麻烦的问题。首先,我会重写你的 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 的返回类型是 ArrayAnyObject,而不仅仅是一个。

对于您的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 ""
    

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

【讨论】:

嗯,首先你会得到一个警告,将 AnyObject 转换为 [AnyObject] 是多余的。问题是我不应该创建另一个 ManagedObjectContext 实例。不过还是谢谢你的关注【参考方案2】:

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

【讨论】:

以上是关于Fetch Request 执行方法不返回任何内容的主要内容,如果未能解决你的问题,请参考以下文章

Stackmob 不执行 fetch 请求而没有任何错误

umijs@use-request源码解读

Wordpress 在使用 fetch API 的 ajax 调用上返回 400 Bad Request

fetch用法

fetch().then() 返回内容类型和正文 [重复]

fetch 报错 Failed to execute 'fetch' on 'Window': Request with GET/HEAD method cannot