RxSwift extension for RealmSwift's types

Overview

RxRealm

Carthage Compatible Version Swift Package Manager compatible License Platform

This library is a thin wrapper around RealmSwift ( Realm Docs ).

Table of contents:

  1. Observing object collections
  2. Observing a single object
  3. Write transactions
  4. Automatically binding table and collection views
  5. Example app

Observing object collections

RxRealm can be used to create Observables from objects of type Results, List, LinkingObjects or AnyRealmCollection. These types are typically used to load and observe object collections from the Realm Mobile Database.

Observable.collection(from:synchronousStart:)

Emits an event each time the collection changes:

let realm = try! Realm()
let laps = realm.objects(Lap.self)

Observable.collection(from: laps)
  .map { 
    laps in "\(laps.count) laps"
  }
  .subscribe(onNext: { text  in
    print(text)
  })

The above prints out "X laps" each time a lap is added or removed from the database. If you set synchronousStart to true (the default value), the first element will be emitted synchronously - e.g. when you're binding UI it might not be possible for an asynchronous notification to come through.

Observable.array(from:synchronousStart:)

Upon each change fetches a snapshot of the Realm collection and converts it to an array value (for example if you want to use array methods on the collection):

let realm = try! Realm()
let laps = realm.objects(Lap.self)

Observable.array(from: laps)
  .map { array in
    return array.prefix(3) //slice of first 3 items
  }
  .subscribe(onNext: { text  in
    print(text)
  })
Observable.changeset(from:synchronousStart:)

Emits every time the collection changes and provides the exact indexes that has been deleted, inserted or updated:

let realm = try! Realm()
let laps = realm.objects(Lap.self)

Observable.changeset(from: laps)
  .subscribe(onNext: { results, changes in
    if let changes = changes {
      // it's an update
      print(results)
      print("deleted: \(changes.deleted)")
      print("inserted: \(changes.inserted)")
      print("updated: \(changes.updated)")
    } else {
      // it's the initial data
      print(results)
    }
  })
Observable.arrayWithChangeset(from:synchronousStart:)

Combines the result of Observable.array(from:) and Observable.changeset(from:) returning an Observable<Array<T>, RealmChangeset?>

let realm = try! Realm()
let laps = realm.objects(Lap.self))

Observable.arrayWithChangeset(from: laps)
  .subscribe(onNext: { array, changes in
    if let changes = changes {
    // it's an update
    print(array.first)
    print("deleted: \(changes.deleted)")
    print("inserted: \(changes.inserted)")
    print("updated: \(changes.updated)")
  } else {
    // it's the initial data
    print(array)
  }
  })

Observing a single object

There's a separate API to make it easier to observe a single object:

Observable.from(object: ticker)
    .map { ticker -> String in
        return "\(ticker.ticks) ticks"
    }
    .bindTo(footer.rx.text)

This API uses the Realm object notifications under the hood to listen for changes.

This method will by default emit the object initial state as its first next event. You can disable this behavior by using the emitInitialValue parameter and setting it to false.

Finally you can set changes to which properties constitute an object change you'd like to observe for:

Observable.from(object: ticker, properties: ["name", "id", "family"]) ...

Write transactions

rx.add()

Writing objects to existing realm reference. You can add newly created objects to a Realm that you already have initialized:

let realm = try! Realm()
let messages = [Message("hello"), Message("world")]

Observable.from(messages)
  .subscribe(realm.rx.add())

Be careful, this will retain your Realm until the Observable completes or errors out.

Realm.rx.add()

Writing to the default Realm. You can leave it to RxRealm to grab the default Realm on any thread your subscribe and write objects to it:

let messages = [Message("hello"), Message("world")]

Observable.from(messages)
  .subscribe(Realm.rx.add())
Realm.rx.add(configuration:)

Writing to a custom Realm. If you want to switch threads and not use the default Realm, provide a Realm.Configuration. You an also provide an error handler for the observer to be called if either creating the realm reference or the write transaction raise an error:

var config = Realm.Configuration()
/* custom configuration settings */

let messages = [Message("hello"), Message("world")]
Observable.from(messages)
  .observeOn( /* you can switch threads here */ )     
  .subscribe(Realm.rx.add(configuration: config, onError: {elements, error in
    if let elements = elements {
      print("Error \(error.localizedDescription) while saving objects \(String(describing: elements))")
    } else {
      print("Error \(error.localizedDescription) while opening realm.")
    }
  }))

If you want to create a Realm on a different thread manually, allowing you to handle errors, you can do that too:

let messages = [Message("hello"), Message("world")]

Observable.from(messages)
  .observeOn( /* you can switch threads here */ )
  .subscribe(onNext: {messages in
    let realm = try! Realm()
    try! realm.write {
      realm.add(messages)
    }
  })
rx.delete()

Deleting object(s) from an existing realm reference:

let realm = try! Realm()
let messages = realm.objects(Message.self)
Observable.from(messages)
  .subscribe(realm.rx.delete())

Be careful, this will retain your realm until the Observable completes or errors out.

Realm.rx.delete()

Deleting from the object's realm automatically. You can leave it to RxRealm to grab the Realm from the first object and use it:

Observable.from(someCollectionOfPersistedObjects)
  .subscribe(Realm.rx.delete())

Automatically binding table and collection views

RxRealm does not depend on UIKit/Cocoa and it doesn't provide built-in way to bind Realm collections to UI components.

a) Non-animated binding

You can use the built-in RxCocoa bindTo(_:) method, which will automatically drive your table view from your Realm results:

Observable.from( [Realm collection] )
  .bindTo(tableView.rx.items) {tv, ip, element in
    let cell = tv.dequeueReusableCell(withIdentifier: "Cell")!
    cell.textLabel?.text = element.text
    return cell
  }
  .addDisposableTo(bag)

b) Animated binding with RxRealmDataSources

The separate library RxRealmDataSources mimics the default data sources library behavior for RxSwift.

RxRealmDataSources allows you to bind an observable collection of Realm objects directly to a table or collection view:

// create data source
let dataSource = RxTableViewRealmDataSource<Lap>(
  cellIdentifier: "Cell", cellType: PersonCell.self) {cell, ip, lap in
    cell.customLabel.text = "\(ip.row). \(lap.text)"
}

// RxRealm to get Observable<Results>
let realm = try! Realm()
let lapsList = realm.objects(Timer.self).first!.laps
let laps = Observable.changeset(from: lapsList)

// bind to table view
laps
  .bindTo(tableView.rx.realmChanges(dataSource))
  .addDisposableTo(bag)

The data source will reflect all changes via animations to the table view:

RxRealm animated changes

If you want to learn more about the features beyond animating changes, check the RxRealmDataSources README.

Example app

To run the example project, clone the repo, and run pod install from the Example directory first. The app uses RxSwift, RxCocoa using RealmSwift, RxRealm to observe Results from Realm.

Further you're welcome to peak into the RxRealmTests folder of the example app, which features the library's unit tests.

Installation

This library depends on both RxSwift and RealmSwift 1.0+.

CocoaPods

RxRealm requires CocoaPods 1.1.x or higher.

RxRealm is available through CocoaPods. To install it, simply add the following line to your Podfile:

pod "RxRealm"

Carthage

To integrate RxRealm into your Xcode project using Carthage, specify it in your Cartfile:

github "RxSwiftCommunity/RxRealm"

Run carthage update to build the framework and drag the built RxRealm.framework into your Xcode project.

Swift Package Manager

In your Package.swift:

let package = Package(
  name: "Example",
  dependencies: [
    .package(url: "https://github.com/RxSwiftCommunity/RxRealm.git", from: "1.0.1")
  ],
  targets: [
    .target(name: "Example", dependencies: ["RxRealm"])
  ]
)

TODO

  • Test add platforms and add compatibility for the pod

License

This library belongs to RxSwiftCommunity. Maintainer is Marin Todorov.

RxRealm is available under the MIT license. See the LICENSE file for more info.

Comments
  • Dependency

    Dependency "RxRealm" has no shared framework schemes

    Wrote github "RxSwiftCommunity / RxRealm" ~> 1.0 in carthage, was the carthage update. Such error came out . If you believe this to be an error, please file an issue with the maintainers at https://github.com/RxSwiftCommunity/RxRealm/issues/new Is there a correspondence ?

    opened by daisukenagata 18
  • 'carthage update' results in failed build

    'carthage update' results in failed build

    A Cartfile containing just: github "RxSwiftCommunity/RxRealm" Results in a failure when building:

    	Task failed with exit code 65:
    	/usr/bin/xcrun xcodebuild -project /Users/user/Desktop/Carthage/Carthage/Checkouts/RxRealm/RxRealm.xcodeproj -scheme RxRealm-tvOS -configuration Release -derivedDataPath /Users/user/Library/Caches/org.carthage.CarthageKit/DerivedData/8.3.3_8E3004b/RxRealm/0.7.1 -sdk appletvos ONLY_ACTIVE_ARCH=NO BITCODE_GENERATION_MODE=bitcode CODE_SIGNING_REQUIRED=NO CODE_SIGN_IDENTITY= CARTHAGE=YES build (launched in /Users/user/Desktop/Carthage/Carthage/Checkouts/RxRealm)
    
    This usually indicates that project itself failed to compile. Please check the xcodebuild log for more details: /var/folders/6s/nws8ng4d4wl4mr6jgt_kvzvr0000gn/T/carthage-xcodebuild.Uq3LIJ.log
    [carthage-xcodebuild.Uq3LIJ.log]
    

    Logfile: (https://github.com/RxSwiftCommunity/RxRealm/files/1341213/carthage-xcodebuild.Uq3LIJ.log)

    XCode CLI tools version: 8.3.3

    opened by rossrossp 10
  • Argument labels '(object:)' do not match any variable overloads

    Argument labels '(object:)' do not match any variable overloads

    screen shot 2017-08-16 at 10 18 41 pm

    I receive an error of "Argument labels '(object:)' do not match any variable overloads" at line 508 of "RxRealm.swift", located at https://github.com/RxSwiftCommunity/RxRealm/blob/master/Pod/Classes/RxRealm.swift. It is triggered on the line of "return from(object: object)"

    Any ideas on why this may be? I have RxRealm version 0.6.0 installed.

    Thanks for your help!

    opened by 1cookspe 10
  • Carthage error: Dependency

    Carthage error: Dependency "RxRealm" has no shared framework schemes

    I am using Carthage version 0.18.1.

    Cartfile snippet:

    github "RxSwiftCommunity/RxRealm" ~> 1.0
    

    When I run carthage update RxRealm, I get the following message:

    Dependency "RxRealm" has no shared framework schemes
    
    opened by insidegui 10
  • 'Can only add notification blocks from within runloops.'

    'Can only add notification blocks from within runloops.'

    I'm getting this exception in my app, not sure how I get it to this state... Posting an issue/question here to see if anyone has the same issue.

    *** Terminating app due to uncaught exception 'RLMException', reason: 'Can only add notification blocks from within runloops.' *** First throw call stack: ( 0 CoreFoundation 0x00000001112bad85 __exceptionPreprocess + 165 1 libobjc.A.dylib 0x0000000110d2edeb objc_exception_throw + 48 2 Realm 0x000000010fce9627 -[RLMRealm addNotificationBlock:] + 0 3 Realm 0x000000010fcef970 -[RLMResults addNotificationBlock:] + 46 4 RealmSwift 0x00000001100ef4c3 _TFC10RealmSwift7Results20addNotificationBlockfFGOS_21RealmCollectionChangeGS0_x__T_CSo20RLMNotificationToken + 243 5 ApptioMobileSwift 0x000000010f79f962 _TTWuRxC10RealmSwift6ObjectrGCS_7Resultsx_17ApptioMobileSwift19NotificationEmitterS2_FS3_20addNotificationBlockfFGOS_21RealmCollectionChangex_T_CSo20RLMNotificationToken + 130 6 ApptioMobileSwift 0x000000010f7a43a1 TFFe17ApptioMobileSwiftRxS_19NotificationEmitterx10RealmSwift19RealmCollectionTyperS0_12asObservableFT_GC7RxSwift10Observablex_U_FGVS3_11AnyObserverQPS0__PS3_10Disposable + 1137 7 ApptioMobileSwift 0x000000010f7a059d TPA__TFFe17ApptioMobileSwiftRxS_19NotificationEmitterx10RealmSwift19RealmCollectionTyperS0_12asObservableFT_GC7RxSwift10Observablex_U_FGVS3_11AnyObserverQPS0__PS3_10Disposable + 1005

    opened by lamson 10
  • RLMException in case of binding Observable.arrayFrom() to tableView, RxRealm 0.4.0

    RLMException in case of binding Observable.arrayFrom() to tableView, RxRealm 0.4.0

    Hi, I found problem when using UITableView+Rx extensions or default UITableViewDataSource with Observable.arrayFrom() extension. If we are scrolling tableView, after write transaction to Realm app will crash with exception. Thanks in advance for recommendations and help.

    Exception *** Terminating app due to uncaught exception 'RLMException', reason: 'Object has been deleted or invalidated.'

    ViewModel

    import Foundation
    import RxSwift
    import RxCocoa
    import RealmSwift
    import RxRealm
    import Moya
    import Moya_ObjectMapper
    import RxSwiftUtilities
    
    struct BrandsViewModel {
        
        let bag = DisposeBag()
        let realm = try! Realm()
        let provider = Provider()
        let activityIndicator = ActivityIndicator()
        
        let results: Results<Brand>
        let changeset: Observable<(AnyRealmCollection<Brand>, RealmChangeset?)>
        let brands: Observable<[Brand]>
        let title: Observable<String>
        let state: Observable<State>
        
        
        init() {
            results = realm.objects(Brand.self)
            changeset = Observable.changesetFrom(results)
            brands = Observable.arrayFrom(results)
            
            title = Observable.from(results)
                .map {
                    $0.count > 0 ? "Brands (\($0.count))" : "Brands"
                }
            
            state = Observable.combineLatest(brands, activityIndicator.asObservable()) {
                $0.isEmpty ? ($1 ? .loading : .empty) : .content
            }
            
        }
        
        func fetchData() {
            provider.request(.brands)
                .trackActivity(activityIndicator)
                .mapArray(Brand.self)
                .subscribe { event -> Void in
                    switch event {
                    case .next(let brands):
                        try! self.realm.write {
                            self.realm.delete(self.realm.objects(Brand.self))
                            self.realm.add(brands)
                        }
                    case .error(let error):
                        print(error)
                    default:
                        break
                    }
                }
                .addDisposableTo(bag)
        }
        
    }
    

    ViewController, UITableView+Rx -> RLMException

    import UIKit
    import RxSwift
    import RxCocoa
    
    class BrandsViewController: UIViewController {
    
        @IBOutlet weak var activityIndicatorView: UIActivityIndicatorView!
        @IBOutlet weak var tableView: UITableView!
        
        let bag = DisposeBag()
        let viewModel = BrandsViewModel()
        
        
        override func viewDidLoad() {
            super.viewDidLoad()
            configureTableView()
            bindViewModel()
        }
        
        override func viewWillAppear(_ animated: Bool) {
            super.viewWillAppear(animated)
            viewModel.fetchData()
            
            if let indexPath = tableView.indexPathForSelectedRow {
                tableView.deselectRow(at: indexPath, animated: true)
            }
        }
        
    }
    
    extension BrandsViewController {
        
        func configureTableView() {
            tableView.register(BrandsTableViewCell.self)
            tableView.contentInset = UIEdgeInsets(top: 63.5, left: 0, bottom: 48.5, right: 0)
            tableView.sectionHeaderHeight = 32
            tableView.rowHeight = 44
        }
        
        func bindViewModel() {
            viewModel.title
                .bindTo(navigationItem.rx.title)
                .addDisposableTo(bag)
            
            viewModel.state
                .map {
                    $0 == .loading
                }
                .bindTo(activityIndicatorView.rx.isAnimating)
                .addDisposableTo(bag)
            
            viewModel.state
                .map {
                    $0 != .content
                }
                .bindTo(tableView.rx.isHidden)
                .addDisposableTo(bag)
            
            viewModel.brands
                .bindTo(tableView.rx.items) { (tableView, row, brand) in
                    let cell: BrandsTableViewCell = tableView.dequeueReusableCell()
                    return cell.configure(with: brand.name)
                }
                .addDisposableTo(bag)
         }
    }
    

    ViewController, UITableViewDataSource –> RLMException

    var brands: [Brand] = []
    
    ...
    
    func bindViewModel() {
            
            ...
            
            viewModel.brands
                .subscribe(onNext: { [unowned self] brands in
                    self.brands = brands
                    self.tableView.reloadData()
                })
                .addDisposableTo(bag)
    }
    
    extension BrandsViewController: UITableViewDataSource {
        
        func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
            return brands.count
        }
        
        func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
            let cell: BrandsTableViewCell = tableView.dequeueReusableCell()
            return cell.configure(with: brands[indexPath.row].name)
        }
    
    }
    

    ViewController, UITableViewDataSource and RealmChangeset –> RLMException

    func bindViewModel() {
            
            ...
            
            viewModel.changeset
                .subscribe(onNext: { [unowned self] brands in
                    self.tableView.reloadData()
                })
                .addDisposableTo(bag)
    }
    
    extension BrandsViewController: UITableViewDataSource {
        
        func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
            return viewModel.results.count
        }
        
        func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
            let cell: BrandsTableViewCell = tableView.dequeueReusableCell()
            return cell.configure(with: viewModel.results[indexPath.row].name)
        }
    
    }
    
    opened by ogrenich 9
  • Observing single object fails on device but works in simulator

    Observing single object fails on device but works in simulator

    If I run RxRealm_Example it works in simulator but I hit fatalError("At present you can't observe objects that don't have primary key.") when I try to run on device.

    opened by juggernate 9
  • 🔝 New maintainer : was

    🔝 New maintainer : was "This repo is looking for a maintainer! [Closed]"

    @JoeMatt and @rynecheow have been great past maintainers of this repo, but lately seems like they have less available time which is absolutely fine - but, it leaves this project in a bit of an unmaintained state.

    I can't maintain this project unfortunately, especially since I'm not a Realm user. I just cut a new release with one of the PRs requested but I have no real way to confirm the code validity / functionality of this.

    If anyone (perhaps @PhilippeCuvillier ?) wants to take over this repo, please let me know! Thanks :)

    discussion 
    opened by freak4pc 8
  • Undefined symbols for architecture x86_64

    Undefined symbols for architecture x86_64

    Xcode 12.0.1 Cocoapods: 1.9.3 RxRealm: 3.0.1

    Ld /Users/me/Library/Developer/Xcode/DerivedData/test-awuaaitkgjwnueaanzztsvjgomcs/Build/Products/Debug-iphonesimulator/RxRealm/RxRealm.framework/RxRealm normal (in target 'RxRealm' from project 'Pods')

    Linking error:

    Undefined symbols for architecture x86_64: "OBJC_CLASS$_RLMNotificationToken", referenced from: objc-class-ref in RxRealm.o ld: symbol(s) not found for architecture x86_64 clang: error: linker command failed with exit code 1 (use -v to see invocation)

    Can not build my project.. Have tried to remove cocoapods and install again.. Does not help..

    opened by axmav 8
  • Does not conform to protocol 'NotificationEmitter' using Swift Packet Manager

    Does not conform to protocol 'NotificationEmitter' using Swift Packet Manager

    Hello,

    Test project: Xcode 12.5.1, Swift 5, iOS deploy 11.0

    I create a new empty iOS project, add RxRealm 5.0.3 (exact version) via Swift Packet Manager. SPM brings in the following package dependencies:

    Realm 10.21.1 RealmDatabase 11.8.0 RxSwift 6.5.0

    When I compile, I get the following errors:

    RxRealm.swift:42:1: error: type 'List' does not conform to protocol 'NotificationEmitter' RxRealm.swift:53:1: error: type 'AnyRealmCollection' does not conform to protocol 'NotificationEmitter' RxRealm.swift:64:1: error: type 'Results' does not conform to protocol 'NotificationEmitter' RxRealm.swift:64:1: error: type 'Results' does not conform to protocol 'NotificationEmitter'

    I would love to contribute a fix for this, if someone could point me in the right direction.

    opened by AllenTheobald 7
  • rx.observe unmanaged object appears broken

    rx.observe unmanaged object appears broken

    When I attempt to observe single properties on an unmanaged object now and then later create a realm I get back an error about duplicate properties in the schema for that object. This was working previously so i'm not sure what changed ?

    • Observing properties for an object that is already managed does not throw the error but this is not what I need.
    • I have tried to remove the observe before creating the realm.
    • the crash happens before I even attempt to add the object to the realm.
    opened by grangej 6
  • Add keyPaths arg to changeset to observe object (#172)

    Add keyPaths arg to changeset to observe object (#172)

    #172 Add keyPaths argument to observe only specified prioerties of realm collection.

    It requres RealmSwift v10.14.0+ (RxRealm v5.0.5 requires RealmSwift v10.21.x) https://www.mongodb.com/docs/realm/sdk/swift/react-to-changes/#register-a-key-path-change-listener https://github.com/realm/realm-swift/releases/tag/v10.14.0

    Example:

    class Dog: Object {
      @Persisted var name = ""
      @Persisted var breed: String?
      @Persisted var dateOfBirth = Date()
    }
    
    let realm = try! Realm()
    let dogs = realm.objects(Dog.self)
    
    // Observe name is changed
    Observable.changeset(from: dogs, keyPaths: ["name"])
      .subscribe(onNext: { results, changes in
        // ...
    })
    
    // You can use PartialKeyPaths
    Observable.changeset(from: dogs, keyPaths: [\Dog.breed])
      .subscribe(onNext: { results, changes in
        // ...
    })
    
    opened by mtgto 1
  • chore(deps): bump addressable from 2.7.0 to 2.8.1

    chore(deps): bump addressable from 2.7.0 to 2.8.1

    Bumps addressable from 2.7.0 to 2.8.1.

    Changelog

    Sourced from addressable's changelog.

    Addressable 2.8.1

    • refactor Addressable::URI.normalize_path to address linter offenses (#430)
    • remove redundant colon in Addressable::URI::CharacterClasses::AUTHORITY regex (#438)
    • update gemspec to reflect supported Ruby versions (#466, #464, #463)
    • compatibility w/ public_suffix 5.x (#466, #465, #460)
    • fixes "invalid byte sequence in UTF-8" exception when unencoding URLs containing non UTF-8 characters (#459)
    • Ractor compatibility (#449)
    • use the whole string instead of a single line for template match (#431)
    • force UTF-8 encoding only if needed (#341)

    #460: sporkmonger/addressable#460 #463: sporkmonger/addressable#463 #464: sporkmonger/addressable#464 #465: sporkmonger/addressable#465 #466: sporkmonger/addressable#466

    Addressable 2.8.0

    • fixes ReDoS vulnerability in Addressable::Template#match
    • no longer replaces + with spaces in queries for non-http(s) schemes
    • fixed encoding ipv6 literals
    • the :compacted flag for normalized_query now dedupes parameters
    • fix broken escape_component alias
    • dropping support for Ruby 2.0 and 2.1
    • adding Ruby 3.0 compatibility for development tasks
    • drop support for rack-mount and remove Addressable::Template#generate
    • performance improvements
    • switch CI/CD to GitHub Actions
    Commits
    • 8657465 Update version, gemspec, and CHANGELOG for 2.8.1 (#474)
    • 4fc5bb6 CI: remove Ubuntu 18.04 job (#473)
    • 860fede Force UTF-8 encoding only if needed (#341)
    • 99810af Merge pull request #431 from ojab/ct-_do_not_parse_multiline_strings
    • 7ce0f48 Merge branch 'main' into ct-_do_not_parse_multiline_strings
    • 7ecf751 Merge pull request #449 from okeeblow/freeze_concatenated_strings
    • 41f12dd Merge branch 'main' into freeze_concatenated_strings
    • 068f673 Merge pull request #459 from jarthod/iso-encoding-problem
    • b4c9882 Merge branch 'main' into iso-encoding-problem
    • 08d27e8 Merge pull request #471 from sporkmonger/sporkmonger-enable-codeql
    • Additional commits viewable in compare view

    Dependabot compatibility score

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
    • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    • @dependabot use these labels will set the current labels as the default for future PRs for this repo and language
    • @dependabot use these reviewers will set the current reviewers as the default for future PRs for this repo and language
    • @dependabot use these assignees will set the current assignees as the default for future PRs for this repo and language
    • @dependabot use this milestone will set the current milestone as the default for future PRs for this repo and language

    You can disable automated security fix PRs for this repo from the Security Alerts page.

    dependencies 
    opened by dependabot[bot] 0
  • RxRealm v5.0.5 tagged release's RxRealm.podspec version is still set to v5.0.4

    RxRealm v5.0.5 tagged release's RxRealm.podspec version is still set to v5.0.4

    It appears as though the maintenance/chore step to bump the version on RxRealm.podspec from v5.0.4 to v5.0.5 occurred after the v5.0.5 tagged release was created.

    This could possibly be the reason for issue https://github.com/RxSwiftCommunity/RxRealm/issues/189.

    opened by kerryknight 0
  • [admin] Convert repo to Git-Flow

    [admin] Convert repo to Git-Flow

    Basic git organization cleanup.

    Add git-flow pattern;

    • [x] Make a develop branch
    • [ ] edit branch protection rules on master/develop
    • [ ] make develop default PR branch
    • [ ] verify release tags, branches per git-flow guidlines
    • [ ] make sure any documentation on CONTRIBUTING has correct branch guidelines
    admin 
    opened by JoeMatt 0
Releases(v5.0.5)
Owner
RxSwift Community
RxSwift ecosystem projects
RxSwift Community
Realm RxSwift - This application was written in order to use Realm, RxSwift frameworks in real example

Realm_RxSwift This simple app was written to introduce basic operations of some

Elbek Khasanov 3 Apr 7, 2022
Super Simple Pager with RxSwift extension

SSPager Super Simple Pager Example To run the example project, clone the repo, and run pod install from the SSPagerExample directory first. Installati

9oya 4 Jul 10, 2022
STDevRxExt contains some extension functions for RxSwift and RxCocoa which makes our live easy.

STDevRxExt Example To run the Example.playground, clone the repo, and run pod install from the Example directory first. Requirements iOS 9.0+ tvOS 9.0

STDev 6 Mar 26, 2021
RxSwift bindings for Permissions API in iOS.

RxPermission RxSwift bindings for Permission API that helps you with Permissions in iOS. Installation RxPermission is available through CocoaPods. I c

Luke 230 Dec 27, 2022
RxSwift wrapper around the elegant HTTP networking in Swift Alamofire

RxAlamofire RxAlamofire is a RxSwift wrapper around the elegant HTTP networking in Swift Alamofire. Getting Started Wrapping RxSwift around Alamofire

RxSwift Community 1.6k Jan 3, 2023
A testable RxSwift wrapper around MultipeerConnectivity

A testable RxSwift wrapper around MultipeerConnectivity RxMultipeer is a RxSwift wrapper for MultipeerConnectivity. Using the adapter pattern, we can

RxSwift Community 69 Jul 5, 2022
iOS & OSX Bluetooth library for RxSwift

RxBluetoothKit is a Bluetooth library that makes interaction with BLE devices much more pleasant. It's backed by RxSwift and CoreBluetooth and it prov

Polidea 1.3k Dec 16, 2022
RxSwift reactive wrapper for view gestures

RxGesture Usage To run the example project, clone the repo, in the Example folder open RxGesture.xcworkspace. You might need to run pod install from t

RxSwift Community 1.3k Dec 30, 2022
Handy RxSwift extensions on NSObject, including rx.disposeBag.

NSObject+Rx If you're using RxSwift, you've probably encountered the following code more than a few times. class MyObject: Whatever { let disposeBag

RxSwift Community 625 Dec 12, 2022
RxSwift extensions for Core Data

RxCoreData Example To run the example project, clone the repo, and run pod install from the Example directory first. Requirements Xcode 9.0 Swift 4.0

RxSwift Community 164 Oct 14, 2022
🤖 RxSwift + State Machine, inspired by Redux and Elm.

RxAutomaton RxSwift port of ReactiveAutomaton (State Machine). Terminology Whenever the word "signal" or "(signal) producer" appears (derived from Rea

Yasuhiro Inami 719 Nov 19, 2022
RxAlamoRecord combines the power of the AlamoRecord and RxSwift libraries to create a networking layer that makes interacting with API's easier than ever reactively.

Written in Swift 5 RxAlamoRecord combines the power of the AlamoRecord and RxSwift libraries to create a networking layer that makes interacting with

Dalton Hinterscher 9 Aug 7, 2020
Support Combine Assign subscriber in RxSwift.

RxAssign Support Combine Assign subscriber in RxSwift. Assign uses a KeyPath which is really nice and useful. ** RxAssign extends Driver and Signal in

Won Heo 3 Dec 7, 2021
This is the demo of MVVM-C structure with dependency injection using RxSwift.

MVVMC-Demo Demo defination This is the demo project, I have integrated two APIs for MovieDB APIS (https://www.themoviedb.org/). One for the listing of

Anshul Shah 61 Dec 6, 2022
RxSwift extentions for Swift optionals and "Occupiable" types

RxOptional RxSwift extentions for Swift optionals and "Occupiable" types. Usage All operators are available on Driver as well unless otherwise marked.

Thane Gill 8 Jun 28, 2020
Realm RxSwift - This application was written in order to use Realm, RxSwift frameworks in real example

Realm_RxSwift This simple app was written to introduce basic operations of some

Elbek Khasanov 3 Apr 7, 2022
Unrealm is an extension on RealmCocoa, which enables Swift native types to be saved in Realm.

Unrealm enables you to easily store Swift native Classes, Structs and Enums into Realm . Stop inheriting from Object! Go for Protocol-Oriented program

Artur  Mkrtchyan 518 Dec 13, 2022
Unrealm is an extension on RealmCocoa, which enables Swift native types to be saved in Realm.

Unrealm enables you to easily store Swift native Classes, Structs and Enums into Realm . Stop inheriting from Object! Go for Protocol-Oriented program

Artur  Mkrtchyan 518 Dec 13, 2022
Unboxing - An extension for KeyedDecodingContainer class to decode a collection of heterogeneous types.

Unboxing An extension for KeyedDecodingContainer class to decode a collection of heterogeneous types. Usage Start by creating an enum that has variant

null 2 Jun 15, 2022
A lightweight extension to Swift's CollectionDifference, supporting moves in addition to removals and insertions, critical when updating interfaces and managing reference types.

DifferenceTracker is a lightweight extension to Swift's CollectionDifference. It defines moves in addition to removals and insertions, critical when updating interfaces and managing reference types.

Giles Hammond 2 Nov 25, 2022