{"id":15030798,"url":"https://github.com/reactivecocoa/reactivecocoa","last_synced_at":"2025-05-13T20:07:14.993Z","repository":{"id":2621958,"uuid":"3606624","full_name":"ReactiveCocoa/ReactiveCocoa","owner":"ReactiveCocoa","description":"Cocoa framework and Obj-C dynamism bindings for ReactiveSwift.","archived":false,"fork":false,"pushed_at":"2024-08-17T14:37:56.000Z","size":17092,"stargazers_count":19919,"open_issues_count":9,"forks_count":3458,"subscribers_count":822,"default_branch":"master","last_synced_at":"2025-05-06T19:52:06.780Z","etag":null,"topics":["reactivecocoa","reactiveswift","swift"],"latest_commit_sha":null,"homepage":"","language":"Swift","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":"openaustralia/openaustralia-parser","license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/ReactiveCocoa.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE.md","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2012-03-02T22:11:24.000Z","updated_at":"2025-05-06T16:55:03.000Z","dependencies_parsed_at":"2024-02-03T18:41:25.280Z","dependency_job_id":"4ae4f29e-b44b-4aa8-8cfa-862f8d6e32e1","html_url":"https://github.com/ReactiveCocoa/ReactiveCocoa","commit_stats":{"total_commits":6897,"total_committers":276,"mean_commits":24.98913043478261,"dds":0.7374220675656082,"last_synced_commit":"1b014240bad02886b6954796f949765e34327212"},"previous_names":[],"tags_count":162,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ReactiveCocoa%2FReactiveCocoa","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ReactiveCocoa%2FReactiveCocoa/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ReactiveCocoa%2FReactiveCocoa/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ReactiveCocoa%2FReactiveCocoa/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/ReactiveCocoa","download_url":"https://codeload.github.com/ReactiveCocoa/ReactiveCocoa/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":254020483,"owners_count":22000750,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["reactivecocoa","reactiveswift","swift"],"created_at":"2024-09-24T20:14:19.019Z","updated_at":"2025-05-13T20:07:14.949Z","avatar_url":"https://github.com/ReactiveCocoa.png","language":"Swift","readme":"\u003cp align=\"center\"\u003e\n\t\u003ca href=\"https://github.com/ReactiveCocoa/ReactiveCocoa/\"\u003e\u003cimg src=\"Logo/PNG/logo.png\" alt=\"ReactiveCocoa\" /\u003e\u003c/a\u003e\u003cbr /\u003e\u003cbr /\u003e\n\tReactive extensions to Cocoa frameworks, built on top of \u003ca href=\"https://github.com/ReactiveCocoa/ReactiveSwift/\"\u003eReactiveSwift\u003c/a\u003e.\u003cbr /\u003e\u003cbr /\u003e\n\t\u003ca href=\"http://reactivecocoa.io/slack/\"\u003e\u003cimg src=\"Logo/PNG/JoinSlack.png\" alt=\"Join the ReactiveSwift Slack community.\" width=\"143\" height=\"40\" /\u003e\u003c/a\u003e\n\u003c/p\u003e\n\u003cbr /\u003e\n\n[![Carthage compatible](https://img.shields.io/badge/Carthage-compatible-4BC51D.svg?style=flat)](#carthage) [![CocoaPods compatible](https://img.shields.io/cocoapods/v/ReactiveCocoa.svg)](#cocoapods) [![SwiftPM compatible](https://img.shields.io/badge/SwiftPM-compatible-orange.svg)](#swift-package-manager) [![GitHub release](https://img.shields.io/github/release/ReactiveCocoa/ReactiveCocoa.svg)](https://github.com/ReactiveCocoa/ReactiveCocoa/releases) ![Swift 5.1](https://img.shields.io/badge/Swift-5.1-orange.svg) ![platforms](https://img.shields.io/badge/platforms-iOS%20%7C%20OS%20X%20%7C%20watchOS%20%7C%20tvOS%20-lightgrey.svg)\n\n⚠️ [Looking for the Objective-C API?][]\n\n🎉 [Migrating from RAC 4.x?][CHANGELOG]\n\n🚄 [Release Roadmap](#release-roadmap)\n\n## What is ReactiveSwift?\n__ReactiveSwift__ offers composable, declarative and flexible primitives that are built around the grand concept of ___streams of values over time___. These primitives can be used to uniformly represent common Cocoa and generic programming patterns that are fundamentally an act of observation.\n\nFor more information about the core primitives, see [ReactiveSwift][].\n\n## What is ReactiveCocoa?\n\n__ReactiveCocoa__ wraps various aspects of Cocoa frameworks with the declarative [ReactiveSwift][] primitives.\n\n1. **UI Bindings**\n\n\tUI components expose [`BindingTarget`][]s, which accept bindings from any\n\tkind of streams of values via the `\u003c~` operator.\n\n\t```swift\n\t// Bind the `name` property of `person` to the text value of an `UILabel`.\n\tnameLabel.reactive.text \u003c~ person.name\n\t```\n\n\t_Note_: You'll need to import ReactiveSwift as well to make use of the `\u003c~` operator.\n\n1. **Controls and User Interactions**\n\n\tInteractive UI components expose [`Signal`][]s for control events\n\tand updates in the control value upon user interactions.\n\n\tA selected set of controls provide a convenience, expressive binding\n\tAPI for [`Action`][]s.\n\n\n\t```swift\n\t// Update `allowsCookies` whenever the toggle is flipped.\n\tpreferences.allowsCookies \u003c~ toggle.reactive.isOnValues\n\n\t// Compute live character counts from the continuous stream of user initiated\n\t// changes in the text.\n\ttextField.reactive.continuousTextValues.map { $0.characters.count }\n\n\t// Trigger `commit` whenever the button is pressed.\n\tbutton.reactive.pressed = CocoaAction(viewModel.commit)\n\t```\n\n1. **Declarative Objective-C Dynamism**\n\n\tCreate signals that are sourced by intercepting Objective-C objects,\n\te.g. method call interception and object deinitialization.\n\n\t```swift\n\t// Notify after every time `viewWillAppear(_:)` is called.\n\tlet appearing = viewController.reactive.trigger(for: #selector(UIViewController.viewWillAppear(_:)))\n\n\t// Observe the lifetime of `object`.\n\tobject.reactive.lifetime.ended.observeCompleted(doCleanup)\n\t```\n\n1. **Expressive, Safe Key Path Observation**\n\n\tEstablish key-value observations in the form of [`SignalProducer`][]s and\n\t`DynamicProperty`s, and enjoy the inherited composability.\n\n\t```swift\n\t// A producer that sends the current value of `keyPath`, followed by\n\t// subsequent changes.\n\t//\n\t// Terminate the KVO observation if the lifetime of `self` ends.\n\tlet producer = object.reactive.producer(forKeyPath: #keyPath(key))\n\t\t.take(during: self.reactive.lifetime)\n\n\t// A parameterized property that represents the supplied key path of the\n\t// wrapped object. It holds a weak reference to the wrapped object.\n\tlet property = DynamicProperty\u003cString\u003e(object: person,\n\t                                       keyPath: #keyPath(person.name))\n\t```\n\nBut there are still more to be discovered and introduced. Read our in-code documentations and release notes to\nfind out more.\n\n## Getting started\n\nReactiveCocoa supports macOS 10.9+, iOS 8.0+, watchOS 2.0+, and tvOS 9.0+.\n\n#### Carthage\n\nIf you use [Carthage][] to manage your dependencies, simply add\nReactiveCocoa to your `Cartfile`:\n\n```\ngithub \"ReactiveCocoa/ReactiveCocoa\" ~\u003e 10.1\n```\n\nIf you use Carthage to build your dependencies, make sure you have added `ReactiveCocoa.framework` and `ReactiveSwift.framework` to the \"_Linked Frameworks and Libraries_\" section of your target, and have included them in your Carthage framework copying build phase.\n\n#### CocoaPods\n\nIf you use [CocoaPods][] to manage your dependencies, simply add\nReactiveCocoa to your `Podfile`:\n\n```\npod 'ReactiveCocoa', '~\u003e 10.1'\n```\n\n#### Swift Package Manager\n\nIf you use Swift Package Manager, simply add ReactiveCocoa as a dependency\nof your package in `Package.swift`:\n\n```\n.package(url: \"https://github.com/ReactiveCocoa/ReactiveCocoa.git\", branch: \"master\")\n```\n\n#### Git submodule\n\n 1. Add the ReactiveCocoa repository as a [submodule][] of your\n    application’s repository.\n 1. Run `git submodule update --init --recursive` from within the ReactiveCocoa folder.\n 1. Drag and drop `ReactiveCocoa.xcodeproj` and `Carthage/Checkouts/ReactiveSwift/ReactiveSwift.xcodeproj` into your application’s Xcode\n    project or workspace.\n 1. On the “General” tab of your application target’s settings, add\n    `ReactiveCocoa.framework` and `ReactiveSwift.framework` to the “Embedded Binaries” section.\n 1. If your application target does not contain Swift code at all, you should also\n    set the `EMBEDDED_CONTENT_CONTAINS_SWIFT` build setting to “Yes”.\n\n## Have a question?\nIf you need any help, please visit our [GitHub issues][] or [Stack Overflow][]. Feel free to file an issue if you do not manage to find any solution from the archives.\n\n## Release Roadmap\n**Current Stable Release:**\u003cbr /\u003e[![GitHub release](https://img.shields.io/github/release/ReactiveCocoa/ReactiveCocoa.svg)](https://github.com/ReactiveCocoa/ReactiveCocoa/releases)\n\n### In Development\n### Plan of Record\n#### ABI stability release\nReactiveCocoa is expected to declare library ABI stability when Swift rolls out resilience support in Swift 5. Until then, ReactiveCocoa will incrementally adopt new language features.\n\n[ReactiveSwift]: https://github.com/ReactiveCocoa/ReactiveSwift\n[ReactiveObjC]: https://github.com/ReactiveCocoa/ReactiveObjC\n[GitHub issues]: https://github.com/ReactiveCocoa/ReactiveCocoa/issues?q=is%3Aissue+label%3Aquestion+\n[Stack Overflow]: http://stackoverflow.com/questions/tagged/reactive-cocoa\n[CHANGELOG]: CHANGELOG.md\n[Carthage]: https://github.com/Carthage/Carthage\n[CocoaPods]: https://cocoapods.org/\n[submodule]: https://git-scm.com/book/en/v2/Git-Tools-Submodules\n[Looking for the Objective-C API?]: https://github.com/ReactiveCocoa/ReactiveObjC\n[Still using Swift 2.x?]: https://github.com/ReactiveCocoa/ReactiveCocoa/tree/v4.0.0\n[`Signal`]: https://github.com/ReactiveCocoa/ReactiveSwift/blob/master/Documentation/FrameworkOverview.md#signals\n[`SignalProducer`]: https://github.com/ReactiveCocoa/ReactiveSwift/blob/master/Documentation/FrameworkOverview.md#signal-producers\n[`Action`]: https://github.com/ReactiveCocoa/ReactiveSwift/blob/master/Documentation/FrameworkOverview.md#actions\n[`BindingTarget`]: https://github.com/ReactiveCocoa/ReactiveSwift/blob/master/Documentation/FrameworkOverview.md#properties\n","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Freactivecocoa%2Freactivecocoa","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Freactivecocoa%2Freactivecocoa","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Freactivecocoa%2Freactivecocoa/lists"}