С быстрым действием iOS (ярлык), какова цель параметра обработчика завершения?

Элемент быстрого действия/быстрого доступа iOS получен при реализации делегирования приложения application(_:performActionFor:completionHandler:).

В этой реализации вы должны называть completionHandler. Требуется Bool.

Кто-нибудь знает, для чего нужен Bool? Я не вижу разницы, независимо от того, проходил ли я true или false. (На самом деле, я не вижу разницы, даже если я пренебрегаю вызовом completionHandler!)

Ответ 1

Короткий ответ: параметр не используется в реализации блока в iOS 10 (предположим, что в iOS 9 тоже, но не могу проверить прямо сейчас).

Длинный ответ: посмотрим, что происходит внутри блока completion:

___50-[UIApplication _handleApplicationShortcutAction:]_block_invoke:
push       rbp                               ; XREF=-[UIApplication _handleApplicationShortcutAction:]+132
mov        rbp, rsp
mov        rax, qword [ds:rdi+0x20]
mov        rdx, qword [ds:rdi+0x28]
mov        rsi, qword [ds:0x1179e88]         ; @selector(_updateSnapshotAndStateRestorationWithAction:)
mov        rdi, rax                          ; argument "instance" for method imp___got__objc_msgSend
pop        rbp
jmp        qword [ds:imp___got__objc_msgSend]
; endp

Я запускаю это на Intel64, поэтому первый аргумент должен быть сохранен в регистре rdi (когда мы вызываем блок под ARC, это экземпляр NSMallocBlock). Селектора нет, поэтому второй параметр (аргумент bool) должен храниться в регистре rsi. Но регистр rsi не используется в коде - он просто отправляет сообщение _updateSnapshotAndStateRestorationWithAction: объекту ds:rdi+0x20 с аргументом ds:rdi+0x28.

Оба ds:rdi+0x20 и ds:rdi+0x28 являются захваченными указателями внутри блока.

Подумайте, что ошибка с параметром как индикатором для функции моментального снимка была неправильной.