diff --git a/README.md b/README.md new file mode 100644 index 0000000..a466446 --- /dev/null +++ b/README.md @@ -0,0 +1,89 @@ +# RxFileMonitor + +[![Carthage compatible](https://img.shields.io/badge/Carthage-compatible-4BC51D.svg?style=flat)](https://github.com/Carthage/Carthage) + +RxSwift `Observable` wrapper for CoreFoundation file system events. + +## Usage + +The most convenient usage is through the RxSwift `Observable` exposed in the module as: + +```swift +Monitoring.folderMonitor(url: URL) -> Observable +``` + +You use it on a folder and will be notified about ... + +- changes to the folder itself, and +- changes to any item inside it (not including sub-folders). + +Example: + +```swift +import RxFileMonitor + +let disposeBag = DisposeBag() +let folderUrl = URL(fileURLWithPath: "/path/to/monitor/") + +Monitoring.folderMonitor(url: folderUrl) + .subscribe(onNext: { event in + print("Folder contents changed at \(event.url) (\(event.change))") + }) + .addDisposableTo(disposeBag) +``` + +### Reacting to file content changes only + +Say you want to update a cache of a folder's notes' contents, you'll be interested in files only: + +```swift +let changedFile = Monitoring.folderMonitor(url: folderUrl) + // Files only ... + .filter { $0.change.contains(.isFile) } + // ... except the Spotlight cache. + .filter { $0.filename != ".DS_Store" } + .map { $0.filename } + .observeOn(MainScheduler.instance) +``` + +Now you will want to update the cache for the changed file: + +```swift +changedFile.subscribe(onNext: cache.updateFile) +``` + +Or if you simply rebuild the whole cache when anything changed, you can stop after filtering for accepted events: + +```swift +let changedFile = Monitoring.folderMonitor(url: folderUrl) + .filter { $0.change.contains(.isFile) } + .filter { $0.filename != ".DS_Store" } + .observeOn(MainScheduler.instance) + .subscribe(onNext: { _ in + cache.rebuild() + }) +``` + +## License + +Copyright (c) 2016 Christian Tietze. + +Distributed under The MIT License: + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/RxFileMonitor.xcodeproj/project.pbxproj b/RxFileMonitor.xcodeproj/project.pbxproj index ec129db..d55c8dd 100644 --- a/RxFileMonitor.xcodeproj/project.pbxproj +++ b/RxFileMonitor.xcodeproj/project.pbxproj @@ -63,6 +63,8 @@ 5096B2B61DD2216B00076058 /* RxSwift.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = RxSwift.framework; path = Carthage/Build/Mac/RxSwift.framework; sourceTree = ""; }; 5096B2BB1DD221D700076058 /* Monitoring.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Monitoring.swift; sourceTree = ""; }; 5096B2C01DD22D6000076058 /* FolderContentChangeEvent.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = FolderContentChangeEvent.swift; sourceTree = ""; }; + 5096B2C21DD22FC200076058 /* LICENSE */ = {isa = PBXFileReference; lastKnownFileType = text; path = LICENSE; sourceTree = ""; }; + 5096B2C41DD2333E00076058 /* README.md */ = {isa = PBXFileReference; lastKnownFileType = net.daringfireball.markdown; path = README.md; sourceTree = ""; }; 50E835431DD1B26900783B62 /* RxFileMonitor.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = RxFileMonitor.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 50E835461DD1B26900783B62 /* RxFileMonitor.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = RxFileMonitor.h; sourceTree = ""; }; 50E835471DD1B26900783B62 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; @@ -122,6 +124,8 @@ 50E835391DD1B26900783B62 = { isa = PBXGroup; children = ( + 5096B2C41DD2333E00076058 /* README.md */, + 5096B2C21DD22FC200076058 /* LICENSE */, 50E835451DD1B26900783B62 /* RxFileMonitor */, 50E835501DD1B26900783B62 /* RxFileMonitorTests */, 50E835621DD1B28400783B62 /* Example */,