RORK LABEN
MAX — Rork MaxはSwiftのネイティブアプリを生成し、iPhone・iPad・Apple Watch・Apple TV・Vision Pro・iMessageに対応しますPUBLISH — Rork Maxは2クリックでApp Store公開まで進められます。料金は月$200ですRN — 標準のRorkはReact Native(Expo)でiOS/Androidのネイティブアプリを生成。素早く形にするならこちらですPRICE — Rorkは無料で開始でき、有料プランは月$25からですFUND — Rorkはa16zから280万ドルを調達。月間訪問は74.3万を超え、成長率は85%とされていますFLOW — 作りたいアプリを平易な言葉で説明すると、ストアに配信できる動くコードが生成され、カメラや通知など端末機能も使えますMAX — Rork MaxはSwiftのネイティブアプリを生成し、iPhone・iPad・Apple Watch・Apple TV・Vision Pro・iMessageに対応しますPUBLISH — Rork Maxは2クリックでApp Store公開まで進められます。料金は月$200ですRN — 標準のRorkはReact Native(Expo)でiOS/Androidのネイティブアプリを生成。素早く形にするならこちらですPRICE — Rorkは無料で開始でき、有料プランは月$25からですFUND — Rorkはa16zから280万ドルを調達。月間訪問は74.3万を超え、成長率は85%とされていますFLOW — 作りたいアプリを平易な言葉で説明すると、ストアに配信できる動くコードが生成され、カメラや通知など端末機能も使えます
記事一覧/開発ツール
開発ツール/2026-06-15上級

電波が切れても操作を止めないアプリ設計 — 楽観的更新と、戻ってきたときの競合解決

Rork で作った Expo アプリを、地下鉄やエレベーターで電波が切れても操作が止まらないように設計します。画面を先に更新する楽観的更新と、通信が戻ったときに食い違いを解く競合解決を、動くコードで組み立てます。

Rork421Expo86オフライン対応2状態管理8同期3

プレミアム記事

地下鉄に乗っているとき、自分のアプリでメモにチェックを付けようとして、くるくる回る読み込み表示が止まらなくなりました。電波が切れていたのです。チェックという一瞬の操作が、通信の往復を待つ作りになっていたために、トンネルを抜けるまでアプリが何も応えてくれませんでした。利用者からすれば、これは「壊れている」のと変わりません。

このとき痛感したのは、通信を前提に画面を組むと、通信がないだけでアプリが死ぬということです。電車・エレベーター・地下の店舗。日常には電波の切れる場所がいくらでもあります。個人開発で複数のアプリを運用していると、こうした環境での挙動に関する低評価レビューが、じわじわとストアの星を削っていきます。

なぜ「待つ」設計はユーザーを失うのか

多くのアプリは、操作をサーバーに送り、成功の返事を受け取ってから画面を更新します。順番としては自然ですが、この順番だと通信の遅さや断絶がそのまま操作の遅さになります。AdMob のバナーが裏で読み込まれているような場面では、なおさら回線が混み、待ち時間が伸びます。

利用者が求めているのは、タップした瞬間にチェックが付くことです。サーバーの返事は、本当はあとからでかまいません。ならば順番を逆にします。先に画面を更新し、サーバーへの送信はあとから追いかける。これが楽観的更新の考え方です。

まず画面を更新し、送信は後ろに回す

楽観的更新の骨格は単純です。タップされたら、ローカルの状態を即座に変え、同時に「サーバーへ送るべき操作」をキューに積みます。送信が成功すればキューから消し、失敗すれば残して後で再送します。

// optimisticStore.ts — 先に画面を変え、送信はキューに積む
type Mutation = { id: string; type: "toggle"; itemId: string; value: boolean };
 
const pending: Mutation[] = [];
let items: Record<string, boolean> = {};
 
export function toggleItem(itemId: string, value: boolean, render: () => void) {
  // 1) 画面を先に更新(体感は即時)
  items[itemId] = value;
  render();
 
  // 2) 送信すべき操作をキューに積む
  const mutation: Mutation = {
    id: `${itemId}-${Date.now()}`,
    type: "toggle",
    itemId,
    value,
  };
  pending.push(mutation);
  void flushQueue();
}

利用者の指から見れば、チェックは0秒で付きます。通信は裏側で静かに進みます。体感速度の改善は劇的で、私のアプリでは操作からフィードバックまでの待ち時間が、計測上およそ400ミリ秒からほぼ0へ縮みました。

ここまでお読みいただきありがとうございます。

この記事の続きを読む

この先には、実装コードやベンチマーク結果など、実務でお役に立てる内容をご用意しています。このサイトは広告を掲載しておらず、サーバーや開発にかかる費用はメンバーの皆様のご支援で成り立っています。もしお役に立てていましたら、ご支援いただけますと大変ありがたいです。

この記事で得られること
電波が切れた瞬間に操作が固まる原因と、楽観的更新で体感速度をゼロ秒にする設計が手に入ります
通信が戻ったときのサーバーとローカルの食い違いを、安全に解く競合解決のコードを持ち帰れます
送信待ちのキューを永続化し、アプリを落としても操作が消えない仕組みを実装できます
Stripe による安全な決済 · いつでもキャンセル可能

この記事を購入する

この先の内容をすべてお読みいただけます。一度のご購入で、いつでも何度でもアクセスできます。このサイトは広告を掲載しておらず、皆さまのご支援がサーバー費用などの運営を支えています。

または
メンバーシップなら全記事が読み放題 →
シェア

お読みいただきありがとうございます

Rork Lab は広告なしで運営しており、サーバー費用などの運営コストはメンバーシップのご支援で賄っています。実装コード・ベンチマーク・本番設計パターンなど、実務でお役立ていただける記事を毎日更新しています。もし読んでよかったと感じていただけましたら、ぜひご覧ください。

  • コピー&ペーストで使える実装コード付き
  • 毎日新しい上級ガイドを追加
  • ¥580/月 または ¥1,480 の永久アクセス
メンバーシップを見る →

関連記事

開発ツール2026-06-18
Rork で出したアプリにオフライン優先を後付けする — 永続キャッシュと書き込みキューの設計
地下鉄でアプリを開いたら真っ白、というレビューが続きました。エラー画面を整えるだけでは足りず、Rork が出した Expo アプリに TanStack Query の永続キャッシュとオフライン書き込みキューを後付けした記録です。楽観的更新・再接続フラッシュ・再生成で消さない隔離まで実装込みで整理します。
開発ツール2026-06-16
課金復元より先に広告を初期化したら、有料ユーザに一瞬広告が出た — Rork(Expo)アプリの起動順序設計
同意取得・ATT・広告初期化・課金復元・リモート設定を、起動の数百ミリ秒のあいだにどの順番で走らせるか。順序を1つ間違えるだけで、有料ユーザに広告が一瞬出たり、EEA で同意なしの計測が走ったりします。Rork で生成した Expo アプリの起動処理を1つのオーケストレータに畳み、競合を設計で潰す手順を実装メモとしてまとめます。
開発ツール2026-06-15
「広告を消す理由」が3つに増えた日 — Rork アプリの広告非表示判定を1か所に畳む設計
課金していないはずの画面だけ広告が出る、あるいは課金済みの読者に広告が出てしまう。原因の多くは「広告を消す条件」がコードのあちこちに散らばっていることでした。サブスク・買い切り・リワード時限解除の3つを1つの状態に畳み、すべての広告表示を同じフックに通す設計を、個人開発で6本のアプリを運用してきた実装メモとしてまとめます。
📚RECOMMENDED BOOKS
大規模言語モデル入門
山田育矢
LLM開発
生成AIプロンプトエンジニアリング入門
我妻幸長
プロンプト
Claude CodeによるAI駆動開発入門
平川知秀
AI駆動開発
※ アフィリエイトリンクを含みます
もっと見る →