Skip to content

Instantly share code, notes, and snippets.

@j796160836
Created September 24, 2019 17:56
Show Gist options
  • Save j796160836/d482345d7d6a628559cad7a2aa00f204 to your computer and use it in GitHub Desktop.
Save j796160836/d482345d7d6a628559cad7a2aa00f204 to your computer and use it in GitHub Desktop.
DelegateDispatcher

DelegateDispatcher

Create an interface to receive delegate callback and dispatch to muitpule observer instances.

Usage

For example, we create an delegate called MyClassDelegate.

protocol MyClassDelegate {
    func myClassDosomething()
}

First, create a dispatcher with your delegate type.

class MyDispatcher {
    static let sharedInstance = MyDispatcher()
    private let dispatcher = DelegateDispatcher<MyClassDelegate>()
}

Second, pipe the original delegate into your dispatcher.

extension MyDispatcher: MyClassDelegate {
    func myClassDosomething() {
        for obj in dispatcher.getObservers() {
            obj.myClassDosomething()
        }
    }
}

Then, add your class to dispatcher observers.

class MyClass1: MyClassDelegate {
    
    func registerObserver() {
        MyDispatcher.sharedInstance.dispatcher.addWeakObserver(self)
    }
    
    func myClassDosomething() {
        // ...
    }
}

class MyClass2: MyClassDelegate {
    
    func registerObserver() {
        MyDispatcher.sharedInstance.dispatcher.addWeakObserver(self)
    }
    
    func myClassDosomething() {
        // ...
    }
}

import Foundation
class DelegateDispatcher<T> {
private let weakObservers = NSPointerArray.weakObjects()
func addWeakObserver(_ observer: T) {
let pointer = UnsafeMutableRawPointer(Unmanaged.passUnretained(observer as AnyObject).toOpaque())
weakObservers.addPointer(pointer)
}
func compact() {
weakObservers.compact()
}
func getObservers() -> [T] {
weakObservers.compact()
return (weakObservers.allObjects as? [T]) ?? []
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment