获取请求执行方法不返回任何内容

时间:2015-12-29 13:57:56

标签: ios database swift core-data appdelegate

在我的应用程序中,我使用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)")打印“返回结果:()”并且它不是nil,它只是一个空的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")
        }

    }

它运行良好,数据正确读取。 以下是您需要了解的内容:我使用getName()的{​​{1}}方法中的AppDelegate方法。因此可能是CoreData在那一刻无法正常工作(我非常怀疑)

好的,这是我的假设:

  1. 由于返回application(application:, didFinishLaunchingWithOptions launchOptions:)而导致出现此问题,因此我丢失了所有数据?
  2. 可能是因为此时CoreData还没有(某种程度上)被激活?
  3. 这只是我犯的其他一些愚蠢的错误吗?
  4. 请建议您的解决方案。提前谢谢!

2 个答案:

答案 0 :(得分:0)

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

exexuteFetchRequest

Array的返回类型是AnyObject getName(),而不仅仅是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 "" } }

对于var html = $(IndexBannerTpl).filter('#tpl-banner1').html(); var template = _.template(html, {items: items_ibm}); 功能,我会执行以下操作。它使用if绑定来安全地处理结果。

shouldAutorotate

给它一个旋转,看看是否有帮助。至少,如果出现任何问题,此代码更安全且不太可能崩溃。

答案 1 :(得分:0)

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