【问题标题】:How to fetch results without NSFetchedResultsControllerDelegate?如何在没有 NSFetchedResultsControllerDelegate 的情况下获取结果?
【发布时间】:2020-12-07 09:56:55
【问题描述】:

我试图从一个不是 NSFetchedResultsControllerDelegate 的类中获取结果,这就是我得到 0 个结果的原因吗?

public static func getTopics() -> Array<ipTopic> {
    if (topics == nil) {
        var fetchedResultsController: NSFetchedResultsController<ipTopic>!
        let pc = CoreDataHub.getPersistentContainer()
        let blogIdeasFetchRequest = NSFetchRequest<ipTopic>(entityName: "ipTopic")
        let primarySortDescriptor = NSSortDescriptor(key: "ipTopicsClip", ascending: true)
        blogIdeasFetchRequest.sortDescriptors = [primarySortDescriptor]
        
        fetchedResultsController = NSFetchedResultsController<ipTopic>(
            fetchRequest: blogIdeasFetchRequest,
            managedObjectContext: pc.viewContext,
            sectionNameKeyPath: nil,
            cacheName: nil)
        do {
            try fetchedResultsController.performFetch()
        } catch {
            print("An error occurred")
            
        }
        print(fetchedResultsController.fetchedObjects?.count)
        for topic in fetchedResultsController.fetchedObjects! {
            topics.append(topic)
        }
    }
    return topics
}

【问题讨论】:

  • 如果您不想使用NSFetchedResultsControllerDelegate,请不要使用NSFetchedResultsController。直接使用NSFetchRequest。我建议阅读更多关于核心数据的内容,这里有一篇文章可能会有所帮助,但它有点旧。 raywenderlich.com/7569-getting-started-with-core-data-tutorial

标签: ios swift core-data nsfetchedresultscontroller


【解决方案1】:

这将创建新的私有队列并运行一段代码。这可以与您的容器一起使用,或者您可以使用容器作为参数

func read(_ block: @escaping (NSManagedObjectContext) -> Void) {
    persistentContainer.performBackgroundTask {
        block($0)
    }
}

这就是你将如何使用它

func fetchEvents() {
    read { context in
        let request: NSFetchRequest<Event> = Event.fetchRequest()
        let events = try? context.fetch(request)
        print(events)
    }
}

【讨论】:

  • 这会不会因为执行和等待而导致 UI 挂起?
  • 不,newBackgroundContext 不会阻塞。它在新的上下文中运行。如果您担心使用它,我已经使用另一个 API 更新了我的答案。
猜你喜欢
  • 2018-05-29
  • 2018-01-24
  • 2019-10-06
  • 2021-01-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多