List内のIDを自動でランダムに変更したい(1時間毎)

Listの並び替えを自動で行いたいです。
Listの投稿にIDを設置して、Low順に表示するのですが、そのIDを自動で決められた時間で更新したいです!
投稿した時間Creatを軸に1時間毎でIDを変更したいです。
もしくは、投稿全体を決められた時間でID変更。

例)
投稿A、ID:1、投稿時間:12時
投稿B、ID:2、投稿時間:12時
:arrow_double_down:1時間で変更の場合(現在時刻13時)
投稿A、ID:3583
投稿B、ID:2222
:arrow_double_down:現在時刻14時
投稿A、ID:2234
投稿B、ID:1234

どうしたらいいでしょうか?

やりたいことはCountDownTimerと乱数の組み合わせで出来るのではないかと思います。(サンプルを作ったので最後に載せます。)

(考え方)
Created Timeを基準にして1HおきにデータのIDを変化させるには1時間おきにCountDownTimerを起動させて、カウントが0になった時のActionとしてIDを乱数を使って変化させます。リストに表示したときにIDの数字で小さい順にソートすれば望む動作が出来ると思います。

一番のポイントは1時間ごとにCountDownTimerを起動させる条件式ですが、以下のように考えました。
60×60×count ー (Current timeー Created Time)×86400 単位:秒

この式でcountとは1時間ごとに1つずつ増えていく整数です。1時間(3600秒)を整数倍して1時間ごとに起動する条件を作ります。(とりあえずcountの初期値は1としました

1.データベース
「投稿名」、「count」、「乱数」が入った以下のようなデータベースを作りました。

アプリのイメージは以下のようです

2.CountDownTimerの条件式
(タイマー秒の設定)

(Actionの設定)
乱数はRAND(1,100)で1~100の間の整数を発生させています。
countはCountDownが終了するたびにUpdateでcount+1として1個ずつ繰り上がる整数を作ります

3.参考アプリ(clone copy可能)

1Hごとの変化だと見ていられないと思うので60秒ごとに変更される内容にしています。注意点としてはアプリを開いた瞬間にCountDownTimerが作動します。Create Timeが基準なので現在時刻に合わせるために急激にcount数が上昇するので20~30秒位は動作が安定しないと思います。このサンプルでは5個のデータが60秒の間にバラバラにIDが変化して順番を入れ替えるので結構頻繁に位置の入れ替えがあります。(CreateTimeがバラバラなので5つ揃って1分ごとに変化するわけではない)

説明かなり省略していますが分かりますかね?本件、相当CountDownTimerを使いこんでいないとその発想が出てこないかも知れません。最初の条件式の86400を掛けているの何故か分かります?

そういう細かい部分を説明しているとブログ2回分くらい書けるネタがこの案件には含まれています。
不明点は質問して下さいね。

ありがとうございます!
大変わかりやすい説明でした!!

何点かお伺いしたいのですが
上記の説明通りに1時間毎にしたんですが時間が1時間毎ではなかったです。。


スクリーンショット 2021-09-29 21.54.29
7時間と24時間設定になってるような。。
追記)adaloの少しバグでした!問題なく1時間でした!
countは初期値1で設定しました

あと乱数についてですが、
1,999など上限の数字を上げるとパフォーマンスは落ちますでしょうか?
1、99999と上限を上げる場合と比較
スクリーンショット 2021-09-29 21.54.58

追記)乱数が発動しなかったです。。
時間終了後のアクションで乱数の設定をしたのですが
IDが全て1になって時間経過しても変化しなかったです。。

早速試してくれたんですね。素晴らしい!

1.乱数について
・・・・ROUND(1,999)は乱数ではないです。ROUNDは四捨五入の関数です。(ROUND UPの略)。正解はRAND(1,999) →RANDOMの略
見た目が似ているので気を付けて下さい。

2.乱数の上限値とパフォーマンスの関係
・・・・よく分かりませんが、関係ないと思います。(多少あったとしてもCounDownTimerの間隔が1Hもあるから瞬時に乱数が生成されなくてもパフォーマンスには影響ないのでは?)

3.その他(時間の基準をどこに置くか?)
やってて感じると思いますが、CountDownTimerはアプリの画面が開かれた瞬間に動き出しますので、最初の30秒~1分くらいは条件式中のcountの数がどんどん変化するので動作が安定しません。

今回基準をCreate timeにしていますが、これでいいのかどうか迷います。

(私が考えたこと)
1.どのデータも動作する基準を同じにする
・・・バラバラに動作するのでなく1H経過したら同じタイミングで乱数を生成し、ソートがかかるようにする?

Created timeを時間の基準に使うからバラバラになるのでここをStart of today(アプリを使っているその日の0:00の事)にすれば同期を取った動きになります。しかも毎日変更されますからアプリを開けた時の初期の動作が不安定な状態が少なくなるかも?

2.Created timeの代わりにUpdate timeを使ってみる?
60×60×count ー (Current timeー Created Time)×86400
countは取り除いて、Createdtime→Updated Timeにする?

60×60 ー (Current timeー Updated Time)×86400

アプリを開いたときのcountがアップする時間がひょっとして無くなるか?
私は試してないのでいろいろ試行錯誤してみて下さい。すばらしいアプリに仕上げて下さいね。

1 Like

あー乱数間違っていました。ありがとうございます!!

色々例を出していただきありがとうございます!
検討した結果、UpdateTimeを使うとパフォーマンスが良かったので
そちらにしたいと思います!!

色々ありがとうございます!!