Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Realm meetup Japan #17
Search
Kishikawa Katsumi
July 24, 2016
Programming
1
320
Realm meetup Japan #17
- Realm Objective-C/Swift 1.0.2
- RxRealm
Kishikawa Katsumi
July 24, 2016
Tweet
Share
More Decks by Kishikawa Katsumi
See All by Kishikawa Katsumi
iOSDC 2024 SMBファイル共有をSwiftで実装する
kishikawakatsumi
1
210
Enhancing Applications with Accessibility API
kishikawakatsumi
3
3.7k
Mastering SwiftSyntax
kishikawakatsumi
4
5.8k
My SwiftData Review
kishikawakatsumi
7
1.4k
Swift Expression Macros: a practical introduction
kishikawakatsumi
3
1.9k
Xcode Cloudの評価
kishikawakatsumi
2
1.3k
Regular expressions basics/正規表現の基本
kishikawakatsumi
7
750
家のいろいろな数値を計測する
kishikawakatsumi
4
2.2k
GitHub Actionsでテストの結果をわかりやすく表示する
kishikawakatsumi
1
1.1k
Other Decks in Programming
See All in Programming
もう少しテストを書きたいんじゃ〜 #phpstudy
o0h
PRO
17
3.9k
2025.2.14_Developers Summit 2025_登壇資料
0101unite
0
180
複数のAWSアカウントから横断で 利用する Lambda Authorizer の作り方
tc3jp
0
110
楽しく向き合う例外対応
okutsu
0
590
Honoをフロントエンドで使う 3つのやり方
yusukebe
7
3.5k
How mixi2 Uses TiDB for SNS Scalability and Performance
kanmo
40
16k
PHPのバージョンアップ時にも役立ったAST
matsuo_atsushi
0
220
Djangoアプリケーション 運用のリアル 〜問題発生から可視化、最適化への道〜 #pyconshizu
kashewnuts
1
260
コードを読んで理解するko build
bells17
1
110
はじめての Go * WASM *OCR
sgash708
1
100
Rails 1.0 のコードで学ぶ find_by* と method_missing の仕組み / Learn how find_by_* and method_missing work in Rails 1.0 code
maimux2x
1
180
CI改善もDatadogとともに
taumu
0
200
Featured
See All Featured
The MySQL Ecosystem @ GitHub 2015
samlambert
250
12k
Into the Great Unknown - MozCon
thekraken
35
1.6k
Code Reviewing Like a Champion
maltzj
521
39k
Rebuilding a faster, lazier Slack
samanthasiow
80
8.9k
CoffeeScript is Beautiful & I Never Want to Write Plain JavaScript Again
sstephenson
160
15k
The Web Performance Landscape in 2024 [PerfNow 2024]
tammyeverts
4
430
Creating an realtime collaboration tool: Agile Flush - .NET Oxford
marcduiker
27
1.9k
Designing on Purpose - Digital PM Summit 2013
jponch
117
7.1k
The Psychology of Web Performance [Beyond Tellerrand 2023]
tammyeverts
46
2.3k
Facilitating Awesome Meetings
lara
52
6.2k
Faster Mobile Websites
deanohume
306
31k
How To Stay Up To Date on Web Technology
chriscoyier
790
250k
Transcript
Realm meetup #17
[email protected]
Katsumi Kishikawa Realm Inc.
[email protected]
Recent Updates
[email protected]
Recent Updates • Realm Objective-C/Swift 1.0.2 (was 1.0.1) • Realm
Java 1.1.0 (was 1.0.1) • Realm React Native 0.14.0 (was 0.13.0) • Realm Xamarin 0.76.0
[email protected]
[email protected]
Realm Objective-C/Swift 1.0.2 (was 1.0.1)
[email protected]
Realm Objective-C/Swift 1.0.2 • ϓϩύςΟ͕ଘࡏ͠ͳ͍ΫϥεΛอଘ͠Α͏ͱ͢Δͱྫ֎ʹ • write(_:)ϝιουͷϒϩοΫͰthrowͰ͖ΔΑ͏ʹ • όΠφϦαΠζ͕গ͠ݮগ •
addNotificationBlock(_:, change:)Ͱॳճͷݺͼग़͠ඞ ͣ.Initial͕ݺΕΔΑ͏ʹ • ٯํͷؔ࿈͕มߋʹͳΔ߹ʹ௨͕ݺΕͳ͍Λमਖ਼
[email protected]
[email protected]
Already compatible with Swift 3 & Xcode 8 https://github.com/realm/realm-cocoa/issues/3796
[email protected]
Protip for Xcode 8 beta3 and Carthage
[email protected]
$ echo
SWIFT_VERSION=\"3.0\">swift3.xcconfig $ XCODE_XCCONFIG_FILE=`pwd`/swift3.xcconfig \ carthage update --platform iOS --no-use-binaries
RxSwift & Realm
[email protected]
What’s Rx?
[email protected]
What’s Rx?
[email protected]
[1, 2, 3, 4, 5, 6]
What’s Rx?
[email protected]
[1, 2, 3, 4, 5, 6] .filter
{ $0 % 2 == 0 }
What’s Rx?
[email protected]
[1, 2, 3, 4, 5, 6] .map
{ $0 * 5 }
What’s Rx?
[email protected]
Array<T> => Observable<T>
RxRealm https://github.com/RxSwiftCommunity/RxRealm
[email protected]
Using RxRealm
[email protected]
pod 'RxSwift' pod 'RxCocoa' pod 'RealmSwift' pod
'RxRealm'
RxRealm makes Realm observable
[email protected]
Realm.asObservable() Results.asObservable() List.asObservable() LinkingObjects.asObservable() AnyRealmCollection.asObservable()
RxRealm makes Realm observable
[email protected]
Results.asObservableArray() List.asObservableArray() LinkingObjects.asObservableArray() AnyRealmCollection.asObservableArray()
RxRealm makes Realm observable
[email protected]
Realm.asObservableChangeset() Results.asObservableChangeset() List.asObservableChangeset() LinkingObjects.asObservableChangeset() AnyRealmCollection.asObservableChangeset()
RxRealm makes Realm observable
[email protected]
Realm.asObservableChangesetArray() Results.asObservableChangesetArray() List.asObservableChangesetArray() LinkingObjects.asObservableChangesetArray() AnyRealmCollection.asObservableChangesetArray()
RxRealm makes Realm observable
[email protected]
Realm.rx_add() Realm.rx_delete()
RxRealm makes Realm observable
[email protected]
public func asObservable() -> Observable<Self>
{ return Observable.create {observer in let token = self.addNotificationBlock {changeset in let value: Self switch changeset { case .Initial(let latestValue): value = latestValue case .Update(let latestValue, _, _, _): value = latestValue case .Error(let error): observer.onError(error) return } observer.onNext(value) } return AnonymousDisposable { observer.onCompleted() token.stop() } } }
RxRealm makes Realm observable
[email protected]
public func asObservable() -> Observable<Self>
{ return Observable.create {observer in let token = self.addNotificationBlock {changeset in let value: Self ... observer.onNext(value) } return AnonymousDisposable { observer.onCompleted() token.stop() } } }
RxRealm makes Realm observable
[email protected]
public func asObservable() -> Observable<Self>
{ return Observable.create {observer in let token = self.addNotificationBlock {changeset in let value: Self ... observer.onNext(value) } return AnonymousDisposable { observer.onCompleted() token.stop() } } }
RxRealm makes Realm observable
[email protected]
public extension NotificationEmitter where Self:
RealmCollectionType { public func asObservable() -> Observable<Self> { return Observable.create {...} } }
RxRealm makes Realm observable
[email protected]
public protocol NotificationEmitter { func
addNotificationBlock(block: (RealmCollectionChange<Self>) -> ()) -> NotificationToken } extension List: NotificationEmitter {} extension AnyRealmCollection: NotificationEmitter {} extension Results: NotificationEmitter {} extension LinkingObjects: NotificationEmitter {}
RxRealm makes Realm observable
[email protected]
public extension NotificationEmitter where Self:
RealmCollectionType { public func asObservable() -> Observable<Self> { return Observable.create {...} } }
Usage
[email protected]
var token: NotificationToken? func searchWithText(text: String) { token
= realm .objects(Location) .filter("...") .sorted("...") .addNotificationBlock { (...) in ... tableView.reloadData() } ... }
Usage
[email protected]
realm .objects(Location) .filter("address CONTAINS %@", query) .sorted("identifier") .asObservable()
.subscribeNext {[unowned self]results in ... }.addDisposableTo(self.bag)
Example
[email protected]
/* Observable<Results<Lap>> - wrap Results as observable */
realm.objects(Lap).asObservable() .map {laps in "\(laps.count) laps"} .subscribeNext {[unowned self]text in self.title = text } .addDisposableTo(bag) /* Observable<Array<Lap>> - convert Results to Array and wrap as observable */ realm.objects(Lap).sorted("time", ascending: false).asObservableArray() .map {array in array.prefix(5) } .bindTo(tableView.rx_itemsWithCellIdentifier("Cell", cellType: UITableViewCell.self)) {row, element, cell in cell.textLabel!.text = formatter.stringFromDate(NSDate(timeIntervalSinceReferenceDate: element.time)) }.addDisposableTo(bag) /* Use bindable sinks to add objects */ addOneItemButton.rx_tap .map { Lap() } .bindTo(Realm.rx_add()) .addDisposableTo(bag) addTwoItemsButton.rx_tap .map { [Lap(), Lap()] } .bindTo(Realm.rx_add()) .addDisposableTo(bag)
Incremental search
[email protected]
class ViewController: UIViewController, UISearchBarDelegate, UITableViewDataSource { ...
func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { return results.count } func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { cell = ... item = results[indexPath.row] cell.textLabel.text = ... return cell } func searchWithText(text: String) { realm .objects(Location) .filter("...") .sorted("...") .addNotificationBlock { (...) in ... } ... tableView.reloadData() } func searchBar(searchBar: UISearchBar, shouldChangeTextInRange range: NSRange, replacementText text: String) -> Bool { ... searchWithText(text) return true }
Incremental search
[email protected]
class ViewController: UIViewController { let bag =
DisposeBag() let realm = try! Realm() @IBOutlet weak var searchBar: UISearchBar! @IBOutlet weak var tableView: UITableView! override func viewDidLoad() { super.viewDidLoad() searchBar .rx_text .subscribeNext { [unowned self] (query) in self.realm .objects(Location) .filter("address CONTAINS %@", query) .sorted("identifier") .asObservable() .bindTo(self.tableView.rx_itemsWithCellIdentifier("Cell", cellType: UITableViewCell.self)) {( cell.textLabel!.text = element.address self.tableView.reloadData() }.addDisposableTo(self.bag) } .addDisposableTo(bag) }
Where to find us • ! Realm Japan User Group:
facebook.com/groups/realmjp • ! Twitter: twitter.com/realmJapan • GitHub: github.com/realm • ! StackOverflow: ja.stackoverflow.com/questions/tagged/realm • ! Email:
[email protected]
• ! Slack: slack.realm.io/
[email protected]
[email protected]
Realm Japan User Group Facebook
[email protected]
Support Chat Slack
[email protected]
Ξϯέʔτ http://bit.ly/RealmJP_17
[email protected]
Questions? Katsuma Kishikawa
[email protected]
www.realm.io/jp @k_katsumi