Проверка шаблона шины для iOS
您最多选择25个主题 主题必须以字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符

126 行
2.9KB

  1. import Combine
  2. import Foundation
  3. public enum Bus { }
  4. public extension Bus {
  5. enum Option {
  6. case async
  7. }
  8. }
  9. extension Bus {
  10. final class Service {
  11. static let singleton = Service()
  12. let events = PassthroughSubject<(key: String, value: Any), Never>()
  13. var subscriptions = [AnyCancellable]()
  14. func send(_ key: String, _ value: Any) {
  15. /**/print("ИГР BusS.send key/value: '\(key)'/'\(value)'")
  16. events.send((key, value))
  17. }
  18. }
  19. }
  20. private extension Bus {
  21. static func subscribe(
  22. _ subscription: AnyCancellable?,
  23. _ sub: UnsafeMutablePointer<[AnyCancellable]>?
  24. ) {
  25. guard let subscription else { return }
  26. if let sub = sub {
  27. sub.pointee.append(subscription)
  28. } else {
  29. Service.singleton.subscriptions.append(subscription)
  30. }
  31. }
  32. }
  33. public extension Bus {
  34. static func receive<T>(
  35. _ keys: Set<String>,
  36. _ handler: @escaping ((String, T) -> Void),
  37. opt: [Option] = [],
  38. sub: UnsafeMutablePointer<[AnyCancellable]>? = nil
  39. ) {
  40. var subscription: AnyCancellable?
  41. let isAsync = opt.contains(.async)
  42. // Async.
  43. if isAsync {
  44. subscription = Service.singleton.events
  45. .compactMap { convertKeyValue(keys, $0) }
  46. .receive(on: DispatchQueue.main)
  47. .sink { v in handler(v.0, v.1) }
  48. }
  49. // Async.
  50. if !isAsync {
  51. subscription = Service.singleton.events
  52. .compactMap { convertKeyValue(keys, $0) }
  53. .sink { v in handler(v.0, v.1) }
  54. }
  55. subscribe(subscription, sub)
  56. }
  57. static func send<T>(
  58. _ key: String,
  59. _ node: AnyPublisher<T, Never>,
  60. opt: [Option] = [],
  61. sub: UnsafeMutablePointer<[AnyCancellable]>? = nil
  62. ) {
  63. var subscription: AnyCancellable?
  64. let isAsync = opt.contains(.async)
  65. // Async.
  66. if isAsync {
  67. subscription = node
  68. .receive(on: DispatchQueue.main)
  69. .sink { v in Service.singleton.send(key, v) }
  70. }
  71. // Sync.
  72. if !isAsync {
  73. subscription = node
  74. .sink { v in Service.singleton.send(key, v) }
  75. }
  76. subscribe(subscription, sub)
  77. }
  78. static func send(_ key: String, _ value: Any) {
  79. Service.singleton.send(key, value)
  80. }
  81. }
  82. public extension Bus {
  83. static func process<Src, Dst>(
  84. _ keysIn: Set<String>,
  85. _ keyOut: String,
  86. _ handler: @escaping ((Src) -> Dst?),
  87. opt: [Option] = [],
  88. sub: UnsafeMutablePointer<[AnyCancellable]>? = nil
  89. ) {
  90. var subscription: AnyCancellable?
  91. let isAsync = opt.contains(.async)
  92. // Async.
  93. if isAsync {
  94. subscription = Service.singleton.events
  95. .compactMap { processKeysValue($0, keysIn, handler) }
  96. .receive(on: DispatchQueue.main)
  97. .sink { vOut in Service.singleton.send(keyOut, vOut) }
  98. }
  99. // Sync.
  100. if !isAsync {
  101. subscription = Service.singleton.events
  102. .compactMap { processKeysValue($0, keysIn, handler) }
  103. .sink { vOut in Service.singleton.send(keyOut, vOut) }
  104. }
  105. subscribe(subscription, sub)
  106. }
  107. }