CoreData асинхронное выполнение использования методаIOS

Программируем под IOS
Ответить
Anonymous
 CoreData асинхронное выполнение использования метода

Сообщение Anonymous »

Я столкнулся с некоторыми зависаниями пользовательского интерфейса при использовании viewContext. Поэтому я использовал асинхронный метод выполнения для viewContext, чтобы избежать блокировки пользовательского интерфейса.
Но я все еще получаю отчеты о зависании пользовательского интерфейса. Вот мой код и основной стек потоков.

Код: Выделить всё

func fetchedResultController(sectionNameKeyPath: String? = nil,
cacheName: String? = nil,
fetchList: Bool = true) async -> NSFetchedResultsController {

if self.request.sortDescriptors == nil {
self.request.sortDescriptors = []
}

if !fetchList {
self.request.fetchLimit = 1
}

let fetchedResultController =  NSFetchedResultsController(fetchRequest: self.request,
managedObjectContext: self.context,
sectionNameKeyPath: sectionNameKeyPath,
cacheName: cacheName)

await self.context.perform {
do {
try fetchedResultController.performFetch()
} catch let error  {
// ...
}
}

return fetchedResultController
}

Код: Выделить всё

Thread 0 - com.apple.main-thread - (TH_STATE_WAITING)
0  libsystem_kernel.dylib +0x1560 _kevent_id
1  libdispatch.dylib +0x267d0     __dispatch_kq_poll
2  libdispatch.dylib +0x271b8     __dispatch_event_loop_wait_for_ownership
3  libdispatch.dylib +0x13590     ___DISPATCH_WAIT_FOR_QUEUE__
4  libdispatch.dylib +0x13158     __dispatch_sync_f_slow
5  CoreData +0x9d120              -[NSManagedObjectContext performBlockAndWait:]
6  CoreData +0x9c5fc              -[NSFetchedResultsController _recursivePerformBlockAndWait:withContext:]
7  CoreData +0x270d8              _developerSubmittedBlockToNSManagedObjectContextPerform
8  CoreData +0x9d0e8              -[NSManagedObjectContext performBlockAndWait:]
9  CoreData +0x9c5fc              -[NSFetchedResultsController _recursivePerformBlockAndWait:withContext:]
10 CoreData +0x9c208              -[NSFetchedResultsController performFetch:]
11 MailLib +0x3a094               specialized closure #1 in Fetcher.fetchedResultController(sectionNameKeyPath:cacheName:fetchList:)
12 MailLib +0x3e2d8               partial apply for specialized closure #1 in Fetcher.fetchedResultController(sectionNameKeyPath:cacheName:fetchList:) ()
13 CoreData +0xd0320              closure #1 in closure #1 in NSManagedObjectContext._rethrowsHelper_perform_enqueued(_:rescue:)
14 CoreData +0xd0180              thunk for @escaping @callee_guaranteed () -> ()
15 CoreData +0x270d8              _developerSubmittedBlockToNSManagedObjectContextPerform
16 libdispatch.dylib +0x3dd0      __dispatch_client_callout
17 libdispatch.dylib +0x125a0     __dispatch_main_queue_drain
18 libdispatch.dylib +0x121b4     __dispatch_main_queue_callback_4CF
19 CoreFoundation +0x5670c        ___CFRUNLOOP_IS_SERVICING_THE_MAIN_DISPATCH_QUEUE__
20 CoreFoundation +0x53910        ___CFRunLoopRun
21 CoreFoundation +0x52cd4        _CFRunLoopRunSpecific
22 GraphicsServices +0x11a4       _GSEventRunModal
23 UIKitCore +0x40a908            
24 UIKitCore +0x4be9cc            UIApplicationMain
25 Works +0xee7b18                main (AppDelegate.swift:13:7)
26 dyld +0x3ce48                  start
Я предполагаю, что вызов PerformFetch в блоке Perform

Код: Выделить всё

viewContext
[/b] выполняет рекурсивный вызов и блокировку.
Нужно ли использовать асинхронное выполнение только для контекста bg?
А использование контекста bg для NSFetchedResultsController может быть решением?
Однако мы используем его для пользовательского интерфейса.

Подробнее здесь: https://stackoverflow.com/questions/787 ... thod-usage
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «IOS»