在Swift

时间:2017-06-24 05:53:27

标签: swift

我想从此代码中删除强制解包(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()永远不会被执行。但我认为这不是一个好主意

1 个答案:

答案 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]
}