我想从此代码中删除强制解包(fetchRequestError!
)。我知道它不能产生问题,因为当mainQueuePosts
为零时fetchRequestError
具有价值。但我想让它变得更好。而且我不想要retu
func fetchMainQueuePost(predicate predicate: NSPredicate? = nil,
sortDescriptors: [NSSortDescriptor]? = nil) throws -> [SeenPosts] {
let fetchRequest = NSFetchRequest(entityName: "SeenPosts")
let mainQueueContext = coreDataStack.mainQueueContext
var mainQueuePosts: [SeenPosts]?
var fetchRequestError: ErrorType?
mainQueueContext.performBlockAndWait() {
do {
mainQueuePosts = try mainQueueContext.executeFetchRequest(fetchRequest) as? [SeenPosts]
} catch let error {
fetchRequestError = error
}
}
guard let posts = mainQueuePosts else {
throw fetchRequestError!
}
return posts
}
我的解决方案,不是很好:
guard let posts = mainQueuePosts else {
if let err = fetchRequestError {
throw err
}
fatalError()
}
fatalError()
永远不会被执行。但我认为这不是一个好主意
答案 0 :(得分:1)
throw
方法错误的常用方法throws
本身是通过删除do - catch
块将错误移交给调用者。
标准fetch
是同步的,你不需要performBlockAndWait()
,你可以安全地强制转发到[SeenPosts]
,因为获取请求是不同的。
如果获取成功,将返回数组,如果发生错误,将抛出错误。
func fetchMainQueuePost(predicate predicate: NSPredicate? = nil,
sortDescriptors: [NSSortDescriptor]? = nil) throws -> [SeenPosts] {
let fetchRequest = NSFetchRequest(entityName: "SeenPosts")
fetchRequest.predicate = predicate
fetchRequest.sortDescriptors = sortDescriptors
return try coreDataStack.mainQueueContext.executeFetchRequest(fetchRequest) as! [SeenPosts]
}