8
votes

Délégué de la multicast linguistique rapide

J'essaie de mettre en œuvre la fonctionnalité de déléguée multidiffusion à Swift. Dans l'objectif C, nous avons cette excellente implémentation

https://github.com/robbiehanson/ Xmppframework / blob / maître / utilitaires / gcdmulticastdélégate.m

et je viens de créer cette fonctionnalité de base: xxx

mon problème est que Il semble que je ne puisse pas comprendre un moyen de faire cela: xxx

afin de donner à la commande "Testring ()" à tous les délégués qui sont dans les nœuds. Quelqu'un peut-il m'aider avec cela?


4 commentaires

Si je le vois correctement, GCDMulticastDelegate fait de lourdes utilisations de NSInvocation et de transfectes: qui sont (autant que je sache) ne soit pas disponible à Swift. GCDMulticastDelegate utilise également le fait que dans l'objectif-C, vous pouvez envoyer n'importe quelle méthode à ID tant que le sélecteur de méthode est connu du compilateur.


Merci, je le savais déjà. Je ne demande pas d'équivalent exact. Mon objectif final est de construire un modèle de délégué multidiffusion réutilisable qui fonctionne à Swift. Y'a-t'il un quelconque moyen d'y arriver?


Salut. Pourriez-vous résoudre le problème?


Essayez celui-ci: Github.com/jonasman/multicastDelegate


6 Réponses :


0
votes

Vous pourriez être capable d'ajouter

@objc


0 commentaires

3
votes

Une simple démo à propos de MultiCastDelegate. xxx


6 commentaires

J'utilise ce modèle et ça fonctionne très bien! Dans Swift 2.0 J'espère que nous pourrons utiliser cela avec des extensions de protocole et simplifier le tout.


Surveillez, les délégués dans op conservent une référence forte à tous ses objets, ils restent donc vivants.


@Eric donc c'est la responsabilité de celui qui utilise cette classe pour supprimer également l'observateur? Ou existe-t-il une autre solution possible?


Oui. Et puis il incombe à OP de libérer les délégués individuels. Voici une meilleure solution: Arielelkin.github.io/articles/Objective-c-multicast -Delegate


@ user1007522 Il y a un problème avec cette implémentation suggérée par Eric, l'objet doit se retirer en tant que délégué. Vérifiez cette solution: Github.com/jonasman/multicastDelegate


Vous pouvez également le changer à une hache là-bas, vous pouvez stocker des références faibles.



2
votes

Voici ma mise en œuvre de la déléguée de multidiffusion utilisant des extensions de protocole SWIFT 2.0. J'ai également ajouté la capacité de supprimer les délégués. Pour ce faire, j'ai fait que mon type de délégué est conforme à NsobjectProtocol, n'a pas compris comment déclarer qu'il devrait s'agir de type de référence à utiliser === Opérateur pour supprimer.

@objc protocol MyProtocol : NSObjectProtocol {
    func method()
}


class MyClass : MulticastDelegateContainer {
    typealias DelegateType = MyProtocol
    var multicastDelegate = [MyProtocol]()

    func testDelegates() {
        invokeDelegate { $0.method() }
    }
}


1 commentaires

Un problème avec cette approche est que vous responsabilisez l'objet délégué pour vous retirer en tant qu'auditeur, ce qui peut être nocif à long terme avec d'autres développeurs travaillant sur le projet, veuillez vérifier cette solution: Github.com/jonasman/multicastDelegate



1
votes

J'ai ajouté ma mise en œuvre d'un délégué multidiffusion Swift sur github: https://github.com/tumtumtum/ SwiftMulticastDelegate

Fondamentalement, vous utilisez l'opérateur surchargé "=>" avec un bloc pour effectuer l'invocation. International, la multicastdelegate appellera ce bloc pour chaque auditeur. P>

class Button
{
  var delegate: MulticastDelegate<ButtonDelegate>?

  func onClick()
  {
    self.delegate => { $0.clicked(self) }
  }  
}


0 commentaires

9
votes

Swift 3 strong> Mise en œuvre:

Adding first delegate.
Invoking delegate 1.
Adding second delegate.
Invoking delegate 1.
Invoking delegate 2.
Removing first delegate.
Invoking delegate 2.
Adding third delegate.
Invoking delegate 2.
Invoking delegate 3.
Third delegate is deallocated by ARC.
Invoking delegate 2.


1 commentaires

Si j'appelle .ReMove (auto) dans un déinit mon application va crancer dire ne peut pas affecter faible. Cela est dû créer une emballeuse faible afin de le rechercher. J'ai corrigé cela en faisant un firseindex (où: comme ceci: retour délégués.firstindex (où: {faim dans si la valeur = faimRef.value {Valeur de retour === (Délégué en tant que délégué )} renvoyer false})



3
votes

OK. Dans certaines des solutions, je vois des erreurs (fortes cycles, conditions de course, ...)

Voici ce que je combine sur la base de recherches d'une journée. Pour la pile de délégués, j'ai utilisé Nshashable. Tous les délégués ont donc une référence faible. P>

Swift 3.1 strong> p>

delegates.invoke(invocation: { $0.delegateFunction })


1 commentaires

Vous pouvez aller plus loin à la moitié de votre comportement souhaité en mettant en œuvre une extension sur MulticastDelegate où T == SomedelegateProtocol et la mise en œuvre de toutes les méthodes de délégation en appelant auto.invoke avec la méthode souhaitée.