2016-10-02 1 views
0

Как я пытаюсь перенести пошагово приложение на Swift3 и имею Objective-C и Swift3 работать вместе, я решила большинство проблем, но следующее:доли DispatchQueue и dispatch_queue_t между Swift3 и Objective-C кодом

В Objective -C, я использовал глобальный сериал dispatch_queue_t в приложении для отправки всей операции с базой данных, чтобы избежать конфликтов в письме в базу данных. Swift3 использует DispatchQueue Сейчас:

Можно ли создать DispatchQueue, который использует ту же dispatch_queue_t очередь, так что я могу послать от Swift3 или Objective с одной и той же очереди и по-прежнему, чтобы избежать конфликта?

Основная очередь явно разделена, поэтому я надеюсь, что это возможно, но не удалось найти способ добиться этого для моей собственной очереди. Поэтому я до сих пор выбирал один язык (например, Objective-C и dispatch_queue_t) и отправлял весь быстрый запрос через объектную оболочку. Я надеюсь, что это лучший способ использовать для обоих языков родной API,

Благодарности

+0

Глобальная (объективно-) C переменная 'dispatch_queue_t myDispatchQueue;' экспортируется в Swift, как 'public var myDispatchQueue: DispatchQueue!', вы можете «просто использовать его» из Swift. Можете ли вы указать, какие именно проблемы у вас были? –

ответ

2

TLDR: Вы можете просто передать DispatchQueue объект Objective C, это тот же объект, как dispatch_queue_t.


dispatch_queue_t определяется, как это в Objective C:

typedef NSObject<OS_dispatch_queue> *dispatch_queue_t; 

Внутренне, A OS_dispatch_queue класс exists, который, по мнению the Swift sources, отображается в DispatchQueue:

Classes: 
- Name: OS_dispatch_object 
    SwiftName: DispatchObject 
- Name: OS_dispatch_queue 
    SwiftName: DispatchQueue 

Это затем further extended для специфичного для Swift API, но этот API передает DispatchQueue obje Ct непосредственно в Objective C. Смотри, например, вызова _swift_dispatch_sync:

@available(OSX 10.10, iOS 8.0, *) 
public func sync(execute workItem: DispatchWorkItem) { 
    // _swift_dispatch_sync preserves the @convention(block) for 
    // work item blocks. 
    _swift_dispatch_sync(self, workItem._block) 
} 

_swift_dispatch_sync является implemented следующим образом:

void 
swift::_swift_dispatch_sync(
    __swift_shims_dispatch_queue_t queue, 
    __swift_shims_dispatch_block_t block) 
{ 
    dispatch_sync(cast(queue), cast(block)); 
} 
+1

Спасибо! Оно работает. Я не пробовал простой подход. Цените подробный ответ, очень полезно! – Brice

Смежные вопросы