Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
41 changes: 18 additions & 23 deletions Sources/SCFNotification/Extension/Array+.swift
Original file line number Diff line number Diff line change
Expand Up @@ -9,31 +9,16 @@
import Foundation

extension Array where Element == Observation {
func filterWith(observer: UnsafeMutableRawPointer?, object: UnsafeRawPointer?) -> Array<Element> {
func remove(observer: UnsafeMutableRawPointer?, name: CFNotificationName?, object: UnsafeRawPointer?) -> Array<Element> {
filter {
guard $0.observerPtr == observer,
$0.objectPtr == object else {
return false
return true
}
return true
}
}


func filterWith(observer: UnsafeMutableRawPointer?) -> Array<Element> {
filter {
guard $0.observerPtr == observer else {
return false
}
return true
}
}

func remove(observer: UnsafeMutableRawPointer?, object: UnsafeRawPointer?) -> Array<Element> {
filter {
guard $0.observerPtr == observer,
$0.objectPtr == object else {
return true
// if name is nil, remove all
if let name {
return !($0.name == name.rawValue)
}
return false
}
Expand All @@ -54,15 +39,25 @@ extension Array where Element == Observation {
}
}

func notifyNeededOnly(observer: UnsafeMutableRawPointer?, object: UnsafeRawPointer?) -> Array<Element> {
func notifyNeededOnly(observer: UnsafeMutableRawPointer?, name: CFNotificationName?, object: UnsafeRawPointer?) -> Array<Element> {
filter {
var isFiltered = true

guard observer == $0.observerPtr else {
return false
}

// if name is nil, observe all notification
if $0.name != nil {
isFiltered = name?.rawValue == $0.name
}

// if object is nil, observe all notification
if let objectPtr = $0.objectPtr {
return object == objectPtr
isFiltered = (object == objectPtr) && isFiltered
}
return true

return isFiltered
}
}
}
13 changes: 8 additions & 5 deletions Sources/SCFNotification/Observation.swift
Original file line number Diff line number Diff line change
Expand Up @@ -11,9 +11,12 @@ import Foundation
struct Observation {
typealias SCFNotificationCallbackObjC = (CFNotificationCenter?, UnsafeMutableRawPointer?, CFNotificationName?, UnsafeRawPointer?, CFDictionary?) -> Void

let name: CFString
var notificationName: CFNotificationName {
.init(name)
let name: CFString?
var notificationName: CFNotificationName? {
guard let name else {
return nil
}
return .init(name)
}

weak var observer: AnyObject?
Expand All @@ -35,8 +38,8 @@ struct Observation {

let notify: SCFNotificationCallbackObjC

init<Observer: AnyObject, Object: AnyObject>(name: CFString, observer: Observer, object: Object?, notify: SCFNotificationCallback<Observer, Object>?) {
self.name = name as CFString
init<Observer: AnyObject, Object: AnyObject>(name: CFString?, observer: Observer, object: Object?, notify: SCFNotificationCallback<Observer, Object>?) {
self.name = name
self.observer = observer as AnyObject?
self.object = object as AnyObject?

Expand Down
13 changes: 8 additions & 5 deletions Sources/SCFNotification/ObservationStore.swift
Original file line number Diff line number Diff line change
Expand Up @@ -35,20 +35,23 @@ class ObservationStore {
}
}

func remove(center: SCFNotificationCenter.CenterType, observer: UnsafeMutableRawPointer?, object: UnsafeRawPointer?) {
func remove(center: SCFNotificationCenter.CenterType,
observer: UnsafeMutableRawPointer?,
name: CFNotificationName?,
object: UnsafeRawPointer?) {
cleanUp()

switch center {
case .local:
localObservations = localObservations
.remove(observer: observer, object: object)
.remove(observer: observer, name: name, object: object)
case .darwinNotify:
darwinNotifyObservations = darwinNotifyObservations
.remove(observer: observer, object: object)
.remove(observer: observer, name: name, object: object)
#if os(macOS)
case .distributed:
distributedObservations = distributedObservations
.remove(observer: observer, object: object)
.remove(observer: observer, name: name, object: object)
#endif
}
}
Expand Down Expand Up @@ -93,7 +96,7 @@ class ObservationStore {
}

observations
.notifyNeededOnly(observer: observer, object: object)
.notifyNeededOnly(observer: observer, name: name, object: object)
.forEach {
$0.notify(center.cfNotificationCenter, observer, name, object, userInfo)
}
Expand Down
16 changes: 10 additions & 6 deletions Sources/SCFNotification/SCFNotificationCenter.swift
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,7 @@ public class SCFNotificationCenter {
observer: observer)
}

public func postNotification(name: CFNotificationName?,
public func postNotification(name: CFNotificationName,
object: AnyObject? = nil,
userInfo: CFDictionary,
deliverImmediately: Bool) {
Expand All @@ -60,12 +60,12 @@ public class SCFNotificationCenter {
extension SCFNotificationCenter {
public static func addObserver<Observer: AnyObject>(center: CenterType,
observer: Observer,
name: CFNotificationName,
name: CFNotificationName?,
object: AnyObject? = nil,
suspensionBehavior: CFNotificationSuspensionBehavior,
callback: @escaping SCFNotificationCallback<Observer, AnyObject>) {

var observation = Observation(name: name.rawValue,
var observation = Observation(name: name?.rawValue,
observer: observer,
object: object,
notify: callback)
Expand All @@ -89,7 +89,7 @@ extension SCFNotificationCenter {

public static func removeObserver<Observer: AnyObject>(center: CenterType,
observer: Observer,
name: CFNotificationName,
name: CFNotificationName?,
object: AnyObject? = nil) {
let observer = unsafeBitCast(observer, to: UnsafeMutableRawPointer.self)

Expand All @@ -98,7 +98,11 @@ extension SCFNotificationCenter {
objectPtr = unsafeBitCast(object, to: UnsafeRawPointer.self)
}

ObservationStore.shared.remove(center: center, observer: observer, object: objectPtr)
if center == .darwinNotify {
objectPtr = nil
}

ObservationStore.shared.remove(center: center, observer: observer, name: name, object: objectPtr)

CFNotificationCenterRemoveObserver(center.cfNotificationCenter, observer, name, objectPtr)
}
Expand All @@ -112,7 +116,7 @@ extension SCFNotificationCenter {
}

public static func postNotification(center: CenterType,
name: CFNotificationName?,
name: CFNotificationName,
object: AnyObject? = nil,
userInfo: CFDictionary,
deliverImmediately: Bool) {
Expand Down