Closed fummicc1 closed 4 years ago
Now, I wonder if the approach that I chooses RealmSwift
as LocalStorageClient is OK.
@takahirom Nice to meet you. I am implementing a bookmark feature for the iOS app. And, I want to confirm that the approach that I choose RealmSwift as LocalStorageClient is good. if any other solutions are better, I want to know it and will implement it as so.
Sorry we are talking about this 🙇
I see. Thank you! I want to try this feature so I am waiting for your response. 😄
I feel that Session::isFavorited
is get-only, so I want to call the end-point which switch bookmark-state and manage each user's bookmarks on the cloud. But, I know that iOS-Client is not authenticated so how to distinguish each user in the back-end.
I felt it is not realistic to use FirebaseAuth anonymously signin
to distinguish each user because I do not know which Firebase plan is selected.
So, I was trying to choose RealmSwift which can persist bookmarked sessions in local storage.
@fummicc1 CC: @roana0229 Sorry for my late response. 🙇 I want to use the same model for Android and iOS as DroidKaigi. Currently, the methods in Kotlin's Session class cannot be called from iOS. Therefore, I think it is good to use Realm's Object when saving and reading in DB, but I would like to use SpeechSession and SserviceSession etc. in the application if possible. So, I want to put code to convert Realm Object into SpeechSession or SpecialSession in Swift. Is it possible? 🙏 Please let me know if you have any opinions.
@takahirom cc @roana0229 Thank you for replying! Now, I would like to confirm a little bit.
Session
is like a base model and I (as an ios-client) can use SpeechSession
or ServiceSession
instead of Session
.SpeechSession
and ServiceSession
may be added in the future?(I wonder what SpecialSession
is.)ServiceSession
is like [Welcome Talk, Lunch] and SpeechSession
is a session that has a speaker, right?I want to confirm the above. Please⤴️
Session
is like a base model and I (as an ios-client) can useSpeechSession
orServiceSession
instead ofSession
.
Exactly.
SpeechSession
and ServiceSession
are only SessionEntity
in db, and it use converted to Session(SpeechSession or ServiceSession)
.
In reference.
- a SessionModel except for
SpeechSession
andServiceSession
may be added in the future?(I wonder whatSpecialSession
is.)
Sorry. SpecialSession
is mistake. 🙇
Now only SpeechSession
and ServiceSession
.
ServiceSession
is like [Welcome Talk, Lunch] andSpeechSession
is a session that has a speaker, right?
Almost good.
SpeechSession
has more than one speakers.
Please feel free to ask us if you have any questions. 😄
@roana0229 Thank you!!
@takahirom @roana0229 @ry-itto Hi, sorry for replying late at night... but the bookmark feature is coming to be done. If possible, I would like you to review my code.🙇♂️
Thank you for your quick work 👍 I will review tonight.
AppBaseSession
which is used in the iOS client is made from Session
(SpeechSession
or ServiceSession
) and there is no converting AppBaseSession
into Session
...
It is against that I should use the same model as the Android client, right?
Using a different model from API will need more changes in the future, I think.👀
I want to use the same SpeechSession
and ServiceSession
and more for Android and iOS. 🙏
I guess better that It's save as class Session: Realm.Object { ... }
.
And It convert to use SpeechSession
and ServiceSession
.
I assumed that logic
only have Kotlin.
Also, I think that using the same DB configuration on Android / iOS has the advantage of being easy to understand.
This purpose is to share the method of the Android model.
It's no problem, if SpeechSession
andServiceSession
are separated in DB.
How about ?
(伝えきれないかも知れないので日本語でも書きます)
Androidで使っているモデルが持つメソッドを共有したいため、iOSでも同じモデル利用したいです。
私のイメージではiOSでもclass Session: Realm.Object { ... }
として保存し、それを利用する際にKotlinのSpeechSession
, ServiceSession
へ変換することで、ロジックをKotlin側にまとめられると想定していました。また、Android/iOSで同じDB構成にした方がわかりやすいというメリットはあると思います。
ただ、目的はAndroidのモデルが持つメソッドを共有することなので、DBへの保存する形はSpeechSession
, ServiceSession
が別れていても問題ないと思います。
どうでしょうか?
@roana0229
Thank you for replying!
私のイメージではiOSでもclass Session: Realm.Object { ... }として保存し、それを利用する際にKotlinのSpeechSession, ServiceSessionへ変換することで、ロジックをKotlin側にまとめられると想定していました。
I see. I think so too, but somehow Session
inherits KotlinBase
class and it is hard to inherit Realm.Object
. So, I decide on the approach.
(わかりました。ですが、Session
クラスはKotlinBase
を継承しており、新たにRealm.Object
を継承することが難しく、今はApp〇〇
というRealm.Object
を継承したクラスを作成し、そのクラスをRealmに保存しています。修正範囲が増え、モデルクラスのコードも二倍に増えるのでいい実装ではないと思いますが、ローカルに保存するための方法が思いつかなく一度このように実装しました。)
すいません、自分の伝え方が悪かったかもしれないです。申し訳ないですが、日本語だけで書きます 🙇
ですが、SessionクラスはKotlinBaseを継承しており、新たにRealm.Objectを継承することが難しく
これはその通りだと思います! 私がコメントした
私のイメージではiOSでも
class Session: Realm.Object { ... }
として保存し、それを利用する際にKotlinのSpeechSession, ServiceSessionへ変換することで、ロジックをKotlin側にまとめられると想定していました。
のclass Session: Realm.Object { ... }
部分は、KotlinBase
を継承しているSession
のことではなく、iOSで内部に保存する用の独自型を指していました。
class SessionEntity: Realm.Object {
// AndroidのSessionEntityと同じプロパティを保持
}
Kotlin
側に定義してあるSpeechSession
,ServiceSession
をswiftからnewすることはできるので、このiOSでRealmを使って内部に保存したEntityを、Realmに保存したモデルから変換できれば、ロジックが共通化できていいなと思っています。このSpeechSession
,ServiceSession
はSession
インターフェースを実装してあるので、View側のコードの変更はなしで行けそうだなと思っていました。
どう思いますか、懸念点などありますか?
@roana0229 cc @ry-itto @takahirom Sorry, the reply was delayed. I fix and now can use the same Model as Kotlin-API and Realm but I wonder if my implementation is good.
In addition to it, I have a few contents to ask... sorry. 🙇♂️
Message:: ResourceIdMessage
and Message::TextMessage
. Is there the same Entity such as MessageEntity
. The reason I am asking it is that SessionEntity needs to persist Session:: Message
startTime
.Please Watch This Demo.
すいません、返事が遅れました。 修正し、UI層ではデータベースに依存せずにSessionを使うことで統一できています。
ですが、いくつか問題点があり、共有させてください。
ios-combined.Session.Message
に TextMessage
とResourceIdMessage
があり、仕様が理解できていなく、Realm側のエンティティ SessionEntity
にメッセージを保存できていません。
同じ開始時刻のセッションをお気に入りにしたとき、同じ開始時刻内でのセッションの並びがソートできていません。
異なるデータベースから取得してきたデータを結合しているため、現在は手動でソートしています。そこでstartTime
が同じセッションについてのソートの方法が思いつかなく、UIが急にカタつくような体験になってしまっています。(デモ動画を参照してみてください。🙇♂️)
もしかしたら、付け足すかもしれないですが、今のところ上記2点を共有させてください。mm
ios-combined.Session.Messageに TextMessageとResourceIdMessageがあり、仕様が理解できていなく、Realm側のエンティティ SessionEntityにメッセージを保存できていません。
val message: LocaledString?
のようなので、気にしなくて良さそうです。そのクラスはAndroidでも使われていなそうです。
同じ開始時刻のセッションをお気に入りにしたとき、同じ開始時刻内でのセッションの並びがソートできていません。
一応部屋名を使えばなんとかなるはず。。です。部屋名がアルファベット順なので 👀
LocaledStringは2つフィールドがあるだけのクラスです!
data class LocaledString(
val ja: String,
val en: String
)
@takahirom
一応部屋名を使えばなんとかなるはず。。です。部屋名がアルファベット順なので 👀
この方法で対応しました。ありがとうございます!
val message: LocaledString? のようなので、気にしなくて良さそうです。そのクラスはAndroidでも使われていなそうです。
分かりました。👍
@ry-itto @takahirom @roana0229
お疲れ様です!長引いてしまいましたが、お気に入り機能ができたと思います。 コンフリクトを修正後のデモ動画・スクリーンショットに差し替えたので後ほどレビューをいただきたいです〜。mm
https://github.com/DroidKaigi/conference-app-2020/pull/668#discussion_r375393410
@fummicc1
Sounds reasonable.
Could you please use first of local session stime
?
And, I think that it don't have to wait for request.
see kotlin logic
I think it's okay to create another Issue or PR, what do you do?
If possible, I want to do this because I also think it should be fixed.
Of course 👍 I look forward to your commit to this PR 😄
@roana0229
Of course 👍 I look forward to your commit on this PR 😄
Thank You!
Sorry, I want to confirm some.
In my currect implementation, it cannnot be ensured that [SessionEntity]
stored in Realm has firstDay(may be 2/20).
So, to write such as sessionEntities.first().session.stime
, all Sessions should be stored in local, I think.
@roana0229 すいません、英語でどう書けばいいか分からなかったので日本語で書きます。mm
問題が、ローカルに保存したセッションの取得がリモートのセッションの取得の成功の可否に依存している点が問題という認識です。(せっかくRealmにエンティティごと保存しているのでオフラインでもお気に入りは取得できるようにしたいというモチベーションです。)
APIからセッションの取得が成功したときに関してはremoteSessions.first.startTime
を基にそれぞれのセッションがDay1なのかDay2なのかを判断し、もしネットワークが不安定などの理由でKotlin-Apiからデータを正常に取得できなかったら、iOS側にハードコーディグした 1582160400
というUNIX時間からそれぞれのセッションがDay1なのかDay2なのかを判断する仕様にしてみました。
結果的にはオフライン時でもお気に入りが見れる仕様にはなっていると思います。 どうでしょうか。👀
No issue was reported. Cool!
Generated by :no_entry_sign: Danger
Your apk has been deployed to https://deploygate.com/distributions/dc9e293a3e6d8224a3e7cbb21aac0f4ef3bd2206. Anyone can try your changes via the link.
Generated by :no_entry_sign: Danger
👀
Thank you always 😄 Awesome 👍 👍 👍
@roana0229 I just discovered some bugs, but it takes a lot of time to fix it with my current technology (sorry...), so I'm glad to have it merged once in this state. Thank you very much.👍👍👍
@fummicc1 No worries. 👍 Even if it has unresolved problem, it can create another issue or pr. It is recommended that would you create a small PR to easy merging. 😄
Issue
Overview (Required)
Links
Screenshot
Demo(old)