Categories
Tags
Alamofire Android AppStoreConnect AWS Bun C++ cAdvisor CFW Cloudflare Cloudflare Access Cloudflare KV Cloudflare Tunnel Cloudflare Workers D1 Deno DevContainer Discord Docker ECR ECS Edizon Emulator EmuMMC Fastlane Firestore Frida Ghidra Git GitHub GitHub Actions GitLab GPG Grafana HACGUI Heroku Homebrew Hono IDA Pro iOS IPSwitch Jailbreak Javascript JSON JWT LanPlay Linode macOS Mirakurun MongoDB NestJS NextJS Nintendo Nintendo Switch NodeJS PHP PostgreSQL Prisma Programming Prometheus Python React Realm RealmSwift Ruby Salmon Run Salmonia3+ Shogi Sideload Snap Splatoon Splatoon2 Splatoon3 SSH Stable Diffusion Starlight Swift Swift Package SwiftUI Switch TensorRT Turf War Typescript TypeScript Ubuntu Ubuntu Server VNC VPN VSCode Vue WARP Wireguard XCode Xcode yarn zsh 家電 横歩取り
342 words
2 minutes
RealmCocoaがSwiftUIに正式対応してるっぽい
RealmSwift
iOS アプリで利用できる軽量データベースフレームワーク。
これが最近アップデートされて SwiftUI にどうやら正式対応したらしい。
というのも、以前からでも SwiftUI で RealmSwift は利用できたのだがリストを ForEach で回して表示しているときにremove
メソッドでリストを削除しようとすると、SwiftUI 側と RealmSwift 側でデータを削除するタイミングがずれてしまうので SwiftUI が「アクセスしようとしたデータがないんだが」というエラーがでてクラッシュしてしまっていた。
これは Realm5.0 で追加されたfreeze()
を使えば常にimmutable
なオブジェクトを返し、クラッシュすることがないようにできたのだがいささか実装がめんどくさかった。
ObservedResults
そんな中現れたのがObservedResults
で、これは RealmSwift で公式サポートされている機能である。
struct ContactsView: View {
@ObservedResults(Person.self) var persons
var body: some View {
List {
ForEach(persons) { person in
Text(person.name)
}
.onMove(perform: $persons.move)
.onDelete(perform: $persons.remove)
}.navigationBarItems(trailing:
Button("Add") {
$persons.append(Person())
}
)
}
}
で、それを使えば削除するメソッドがこんなに簡単にかけてしまう!!
::: warning onMove
ただ、onMove
はこの書き方では動作しないので注意。
:::
しかもこれ、便利なことにpersons
に対してfilter
などを書けても正しく動作する。便利すぎる!!!
RealmCocoaがSwiftUIに正式対応してるっぽい
https://fuwari.vercel.app/posts/2021/08/realmcocoa/