2016-10-02 1 views
0

Comme je suis en train de migrer progressivement une application à swift3 et qui ont travailler ensemble Objective-C et swift3, je l'ai résolu la plupart des problèmes, mais les éléments suivants:parts DispatchQueue et dispatch_queue_t entre swift3 et code Objective-c

Dans Objectif -C, j'ai utilisé une série mondiale dispatch_queue_t dans l'application pour expédier toutes les opérations de base de données comme un moyen d'éviter les conflits d'écriture dans la base de données. Swift3 utilise maintenant DispatchQueue:

Est-il possible de créer un DispatchQueue qui utilise la même file d'attente dispatch_queue_t pour que je puisse envoyer de Swift3 ou Objective c vers la même file d'attente et continuer à éviter les conflits?

La file d'attente principale est clairement partagée, donc j'espère que c'est possible, mais je n'ai pas trouvé de moyen d'y parvenir pour ma propre file d'attente. J'ai donc eu jusqu'à maintenant choisir une langue (par exemple Objective-C et dispatch_queue_t) et envoyer toute la requête rapide via un wrapper objectif. J'espère qu'il ya une meilleure façon de tirer parti à la fois des API natives langue

Merci de

+0

A global (Objective) C variable 'dispatch_queue_t myDispatchQueue,' est exportée vers Swift 'public var myDispatchQueue: DispatchQueue!', vous pouvez simplement l'utiliser depuis Swift. Pouvez-vous préciser quels problèmes exactement vous avez eu? –

Répondre

2

TLDR: Vous pouvez juste passer l'objet DispatchQueue à l'objectif C, il est le même objet que le dispatch_queue_t.


dispatch_queue_t est défini comme tel dans l'objectif C:

typedef NSObject<OS_dispatch_queue> *dispatch_queue_t; 

interne, une classe OS_dispatch_queueexists, qui, selon the Swift sources, est mappé à DispatchQueue:

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

Il est puis further extended pour l'API spécifique à Swift, mais cette API transmet l'objet DispatchQueue ct directement dans l'objectif C. Voir par exemple appel à _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 est implemented comme ceci:

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

Merci! Ça marche. Je n'avais pas essayé l'approche simple. Appréciez la réponse détaillée, très utile! – Brice