Как получить результаты без NSFetchedResultsControllerDelegate?

#ios #swift #core-data #nsfetchedresultscontroller

#iOS #swift #core-data #nsfetchedresultscontroller

Вопрос:

Я пытаюсь получить результаты из класса, который не является 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
}
  

Комментарии:

1. если вы не хотите использовать, NSFetchedResultsControllerDelegate тогда не используйте NSFetchedResultsController . Вместо этого используйте NSFetchRequest напрямую. Я бы посоветовал подробнее ознакомиться с core data, вот статья, которая может помочь, но она немного устарела. raywenderlich.com/7569-getting-started-with-core-data-tutorial

Ответ №1:

Это создаст новую частную очередь и потребует запуска блока кода. Это может работать с вашим контейнером или вы можете использовать container в качестве аргумента

 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)
    }
}
  

Комментарии:

1. Это приведет к зависанию пользовательского интерфейса из-за выполнения и ожидания?

2. Нет, newBackgroundContext не будет блокироваться. он выполняется в новом контексте. Если у вас возникли проблемы с этим, я обновил свой ответ, добавив использовать другой API.