Skip to content

Repository files navigation

PublishedKVO

buildtestslanguagelicense

platformTwitter

EthereumLitecoin

PublishedKVO provides Apples Combine @Published for class-types using Key-Value-Observing (KVO requires classes to be NSObject-based). @PublishedKVO automatically publishes objects based on one or mutliple key paths. Attention: When using with SwiftUI unexpected results may occur since this publisher usually emits values after they are set inside the object (and before if the variable is overwritten/re-assigned), not always before as with the structs willSet-based @Published - this is mostly related to SwiftUIs diffing and/or animation features, probably.

Requirements

  • Swift >= 5
  • iOS >= 13
  • macOS >= 10.15
  • tvOS >= 13
  • watchOS >= 6

Installation

Swift Package Manager

The Swift Package Manager is a tool for automating the distribution of Swift code and is integrated into the swift compiler.

Add the Package URL https://github.com/matis-schotte/PublishedKVO.git in Xcodes project viewer. Adding it to another Package as a dependency is as easy as adding it to the dependencies value of your Package.swift.

dependencies:[.package(url:"https://github.com/matis-schotte/PublishedKVO.git", from:"0.1.0")]

Usage

classExample{@PublishedKVO(\.completedUnitCount)varprogress=Progress(totalUnitCount:2)@PublishedvartextualRepresentation="text"}letex=Example()
// Set up the publishers
letc1= ex.$progress.sink{print("\($0.fractionCompleted) completed")}letc2= ex.$textualRepresentation.sink{print("\($0)")}
// Interact with the class as usual
ex.progress.completedUnitCount +=1
// outputs "0.5 completed"
// And compare with Combines @Published (almost°) same behaviour
ex.textualRepresentation ="string"
// outputs "string"
ex.$progress.emit() // Re-emits the current value
ex.$progress.send(ex.progress) // Emits given value

° See Attention comment from above about SwiftUI and the following example:

classExample{@PublishedKVO(\.completedUnitCount)varprogress1=Progress(totalUnitCount:5)@Publishedvarprogress2=Progress(totalUnitCount:5)@Publishedvarprogress3="0.0"}letex=Example()
// Class using @PublishedKVO
letc1= ex.$progress1.sink{print("$progress1 incomming \($0.fractionCompleted) actual \(ex.progress1.fractionCompleted)")}
// Class using @Published
letc2= ex.$progress2.sink{print("$progress2 incomming \($0.fractionCompleted) actual \(ex.progress2.fractionCompleted)")}
// Struct using @Published
letc3= ex.$progress3.sink{print("$progress3 incomming \($0) actual \(ex.progress3)")}
ex.progress1.completedUnitCount +=1
ex.progress2.completedUnitCount +=1
ex.progress3 ="0.2"
ex.progress1.completedUnitCount +=1
ex.progress2.completedUnitCount +=1
ex.progress3 ="0.4"
/* Outputs (incomming should new value, actual should be old value):
$progress1 incomming 0.0 actual 0.0
$progress2 incomming 0.0 actual 0.0
$progress3 incomming 0.0 actual 0.0
$progress1 incomming 0.2 actual 0.2
// no output from $progress2
$progress3 incomming 0.2 actual 0.0
$progress1 incomming 0.4 actual 0.4
// no output from $progress2
$progress3 incomming 0.4 actual 0.2
*/

ToDo

  • Add SwiftLint (by adding xcodeproj: swift package generate-xcodeproj, helps support Xcode Server, too)
  • Add Travis CI (without xcodeproj see reddit, medium)
  • Add codecov
  • Add codebeat
  • Add codeclimate
  • Add codetriage
  • Add jazzy docs
  • Add CHANGELOG.md
  • Add Carthage support
  • Add Cocoapods support

License

PublishedKVO is available under the Apache-2.0 license. See the LICENSE file for more info.

Author

Matis Schotte, dm26f1cab8aa26@ungeord.net

https://github.com/matis-schotte/PublishedKVO

About

PublishedKVO provides Apples Combine `@Published` for class-types using Key-Value-Observing (KVO requires classes to be NSObject-based).

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages