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
330
1
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Realm meetup Japan #17
- Realm Objective-C/Swift 1.0.2
- RxRealm
Kishikawa Katsumi
July 24, 2016
More Decks by Kishikawa Katsumi
See All by Kishikawa Katsumi
OCRを使ってゲームのアイテムをデータ化する
kishikawakatsumi
0
160
Running Swift without an OS
kishikawakatsumi
0
990
浮動小数の比較について
kishikawakatsumi
0
610
Automatic Grammar Agreementと Markdown Extended Attributes について
kishikawakatsumi
0
270
愛される翻訳の秘訣
kishikawakatsumi
3
480
Private APIの呼び出し方
kishikawakatsumi
3
1k
iOSでSVG画像を扱う
kishikawakatsumi
0
250
Build your own WebP codec in Swift
kishikawakatsumi
2
2.7k
iOSDC 2024 SMBファイル共有をSwiftで実装する
kishikawakatsumi
1
330
Other Decks in Programming
See All in Programming
DynamoDBの基礎を振り返りながらベクトル検索機能を理解する
musan
2
170
まずはプロンプトガイドを読もう、話はそれからだ
kiakiraki
1
210
tsc.rip を支える技術 / Kyoto.なんか #8
susisu
0
170
承認済みなのに差戻しできてしまうバグ、型で潰せます
shinchit
0
110
freee が目指す データ マネジメント戦略 AI-Ready 時代を支える 攻めのガバナンスとは
freee
PRO
0
470
[PyCon KR 2026] More Variants, More Diversity for AI Accelerators
achimnol
0
110
VibeCodingからAgenticWorkflowへ
starfish719
0
830
MySQLとPostgreSQLって何が違うの?
akagami
0
130
生成AIで帳票OCRが「簡単に」作れる時代になった?
kon_shou
0
1.2k
Go 1.27からのGODEBUG / Go 1.27 リリースパーティ #go127party
mazrean
0
200
リアルな遅延を測る仕様
kota_yata
1
120
Building a Meta Ray-Ban display app
akkeylab
0
180
Featured
See All Featured
Conquering PDFs: document understanding beyond plain text
inesmontani
PRO
4
3k
A Tale of Four Properties
chriscoyier
163
24k
Getting science done with accelerated Python computing platforms
jacobtomlinson
2
450
A Guide to Academic Writing Using Generative AI - A Workshop
ks91
PRO
1
390
Thoughts on Productivity
jonyablonski
76
5.3k
HDC tutorial
michielstock
2
820
Discover your Explorer Soul
emna__ayadi
2
1.3k
Avoiding the “Bad Training, Faster” Trap in the Age of AI
tmiket
0
210
Measuring Dark Social's Impact On Conversion and Attribution
stephenakadiri
2
260
Pawsitive SEO: Lessons from My Dog (and Many Mistakes) on Thriving as a Consultant in the Age of AI
davidcarrasco
0
220
The innovator’s Mindset - Leading Through an Era of Exponential Change - McGill University 2025
jdejongh
PRO
1
290
Mobile First: as difficult as doing things right
swwweet
225
10k
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