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")
它运行良好,数据被正确读取。
这里是你需要知道的:我在AppDelegate
的application(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
的返回类型是 Array
的 AnyObject
,而不仅仅是一个。
对于您的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 执行方法不返回任何内容的主要内容,如果未能解决你的问题,请参考以下文章
Wordpress 在使用 fetch API 的 ajax 调用上返回 400 Bad Request
fetch 报错 Failed to execute 'fetch' on 'Window': Request with GET/HEAD method cannot