Swift: редкий cra sh в строке, который говорит только someDispatchQueue.syn c { - PullRequest
0 голосов
/ 10 июля 2020

Из 6 тестеров один пользователь столкнулся с ошибкой sh в строке, в которой указано только:

someDispatchQueue.sync { //Thread 0 crash

someDispatchQueue не может быть нулевым, потому что оно объявлено как

let someDispatchQueue = DispatchQueue(label: "SomeDispatchQueue") в начале класса.

Единственные две причины sh там, которые я мог придумать, это

A) проблемы с тем, как это при вызове, а именно как

DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + delay) {
//a few functions in between
    someDispatchQueue.sync {

Может быть, вы не можете позвонить на customQueue.sync{} внутри main.async{}? Тем не менее, этот тестировщик - единственный, кто испытал эту ошибку sh, тогда как он на 99% уверен, что другие 5 тестеров тоже запускают эту функцию - без каких-либо проблем. Он также работает на моем устройстве без проблем.

B) указанная строка журнала отключена

Должны ли журналы Swift cra sh отображать точную точку сбоя? Или это может быть несколько строк? В журнале написано следующее:

Exception Type:  EXC_BREAKPOINT (SIGTRAP)
Exception Codes: 0x0000000000000001, 0x0000000100f2f95c
Termination Signal: Trace/BPT trap: 5
Termination Reason: Namespace SIGNAL, Code 0x5
Terminating Process: exc handler [6599]
Triggered by Thread:  0

Thread 0 name:
Thread 0 Crashed:
0   AppName                         0x0000000100f2f95c closure #1 in FileDB.prepareFile() + 508 (<compiler-generated>:0)
1   AppName                         0x0000000100f39734 partial apply for thunk for @callee_guaranteed () -> () + 20 (<compiler-generated>:0)
2   AppName                         0x0000000100f2ccf4 thunk for @escaping @callee_guaranteed () -> () + 20 (<compiler-generated>:0)
3   libdispatch.dylib               0x000000019770c33c _dispatch_client_callout + 20 (object.m:495)
4   libdispatch.dylib               0x00000001977191f4 _dispatch_lane_barrier_sync_invoke_and_complete + 60 (queue.c:996)
5   AppName                         0x0000000100f2f6b4 FileDB.prepareFile() + 264 (FileDB.swift:138)                                            //line 138 is the someDispatchQueue.sync {
6   AppName                         0x0000000100f79844 ICEFrameworkHandler.initiateWrite() + 728 (ICEFrameworkHandler.swift:254)
7   AppName                         0x0000000100f78e18 closure #1 in ICEFrameworkHandler.delayRun(delay:stamp:) + 140 (ICEFrameworkHandler.swift:164)     //the function that calls the DispatchQueue.main.asyncAfter
8   AppName                         0x0000000100f7e508 thunk for @escaping @callee_guaranteed () -> () + 28 (<compiler-generated>:0)
9   libdispatch.dylib               0x000000019770c33c _dispatch_client_callout + 20 (object.m:495)
10  libdispatch.dylib               0x000000019770eaf8 _dispatch_continuation_pop + 408 (inline_internal.h:2484)
11  libdispatch.dylib               0x000000019771f624 _dispatch_source_invoke + 1224 (source.c:568)
12  libdispatch.dylib               0x00000001977184f0 _dispatch_main_queue_callback_4CF + 560 (inline_internal.h:2525)
13  CoreFoundation                  0x00000001979e76b0 __CFRUNLOOP_IS_SERVICING_THE_MAIN_DISPATCH_QUEUE__ + 16 (CFRunLoop.c:1749)
14  CoreFoundation                  0x00000001979e22c8 __CFRunLoopRun + 1708 (CFRunLoop.c:3069)
15  CoreFoundation                  0x00000001979e18f4 CFRunLoopRunSpecific + 480 (CFRunLoop.c:3192)
16  GraphicsServices                0x00000001a1df8604 GSEventRunModal + 164 (GSEvent.c:2246)
17  UIKitCore                       0x000000019bbb5358 UIApplicationMain + 1944 (UIApplication.m:4823)
18  AppName                         0x0000000100f150b4 main + 68 (AppDelegate.swift:19)
19  libdyld.dylib                   0x000000019785d2dc start + 4

@ matt

let someDispatchQueue = DispatchQueue(label: "SomeDispatchQueue")

DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + 0.1) {

    someDispatchQueue.sync {
        print("someDispatchQueue.sync") //prints first, no exception
    }
    print("end of asyncAfter()")        //prints second, reaches statement without exception
}

1 Ответ

0 голосов
/ 10 июля 2020

Эта строка:

DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + delay) {

... доказывает, что когда мы попадаем сюда, мы находимся в основной очереди . Хорошо, теперь:

    someDispatchQueue.sync {

Ух ты! Вы не должны никогда произносить sync, когда находитесь в основной очереди . Это потому, что sync означает «Заблокируйте меня; Я хочу остановиться и дождаться, пока эта другая очередь завершит sh следующую задачу». Но «я» - это основная очередь; вы никогда не должны блокировать основную очередь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...