HackerQuest

No app, no life

趣味と実益を兼ねてプログラマをやっている者👨‍💻

iOSDC2022 Day1 & Day2 参加記録

Day0に引き続きDay1&2のiwillblog Day0の記事はこちらから

pasokatu.hateblo.jp

全体の感想

2019年から連続4回目の参加となりました! 新卒でiOSエンジニアとなった自分が会社の先輩におすすめされて初めて参加したカンファレンスでした! 初めてのLTで岸川さんの発表を見て難しいけどとても感動したのを覚えています。 そんな自分もスピーカーとして参加できる日が来て感動しております(。•́ωก̀。)…グス 立木さん自分の名前を読んでいただきありがとうございます! 来年は現地参加したい

以下はそれぞれのセッションと感想

Swift Concurrency Next Step

fortee.jp

おさらい

Structured Concurrency - Task間で階層構造を作って同時処理を実行

Unstructured Concurrency - 独立している

Actor - データ競合を防ぐ

最近のUpdate情報

non-isolated Actorに守られていない エグゼキュータ asyncコードを実行する

実行エグゼキュータの明確化

Sendableチェックのルール変更 全てのasyncコードの引数と戻り値は全てSendable ただし同じActorの場合は問題ない

Clock, InstantProtocol, DurationProtocol 時計、瞬間、期間 iOS16以降のみ

Strict Concurrency Checking - 将来エラーになるコードをワーニングとして検知できる Build Settingsからチェック 三つのモードがある

実装上の注意

  • MainActorブロッキング MainThreadを抽象化した特別なActor UIがフリーズしてしまう現象 可能な限りバックグランドで処理をする

  • Actor競合 並列処理中で共有したActor jounosyorigahairutosyo処理まちが協業 Actor上での競合を減らす

  • 強調スレッドプールの枯渇 「スレッドは常に動き続けることができる」を意識する

Task内でブロックを避ける ブロックする場合は最小の範囲で デバッグ方法で強調スレッドプールのサイズを1にできる

  • Continuationの誤用 既存のコールバックをasyncに変換するために使う

ルール 全ての実行パスで必ず1回ずつ呼ぶ

CheckedContinuationを使って開発時にチェックできる

Actorとリエントラント

Actorは他の処理を実行できる

注意!「リエントラント中に内部状態が変わることがある」

Actor処理の実行順序

Priorityを尊重する 呼び出した順に実行されるとは限らない

Task.initなどのクロージャ内は順番に実行される

強調キャンセル

タスクの階層構造内の下層にあるTaskがエラーをスローしたり上層のTaskがキャンセルされた場合に他もキャンセルになる

メモリリーク

Task.initにはselfが不要 スコープ内に参照が閉じている

画面が閉じるタイミングでキャンセルすれば問題ない

インスタンスの解放遅延

弱参照されたものは保持されないことに注意 強参照すれば保持される

MainActor.run Task { @MainActor }の違い

どちらもスコープ内はメインスレッドで処理される

MainActor - 即座に処理が実行 - asyncコンテキストで実行

Task - 次のRunLoopで処理 - Sync

Sendableクロージャの誤解

Sendable以外はキャプチャできない 可変変数はキャプチャできない

Swift Async Algorithm Package

非同期に連続で流れてくる値を分かりやすく処理できる

SequenceからAsyncSequenceの生成 AsyncSequence の結合 zipで結合してタプルで出力

感想

Swift Concurrencyはまだまだ移行期なので挙動をちゃんと確認して導入していく必要があると感じました! Swift ForumsやSwiftのリポジトリ、テストコードなどをチェック Swift6で破壊的変更があるので備えておきたい

CoreGraphicsでドット絵を描こう

fortee.jp

interpolation(.none)で画像自体のリサイズができるがメモリを多く表示するため注意

楕円のアルゴリズム Bresenhams line algorithm noppefoxwolf/swift-line-algorithm

塗りつぶし Flood Fillというアルゴリズム Swiftなら型安全にメモリを直接・書き込みして高速化できる

noppefoxwolf/PixelArtKit

感想

ドット絵のアプリを作って見たくなった! 大体大変なところはnoppeさんが解決してくれてそうw PiPでの話でも出てきたCGContext周りが詳しく解説してくれてそちらの理解も深まった! CoreGraphicsはSwiftUI時代においても強力

Day2

モバイルアプリのオブザーバビリティを向上させるプラクティス

モバイルアプリの信頼性はむずい

  • バイス数、モデルの種類が多い
  • コントロールできない
  • モニタリング大変
  • 変更管理がむずい

ラクティス

  • レポート  システム全体の状態、ユーザー体験

定期的なメトリクス確認 → マイリリースごとにメトリクス指標の確認 → 確認したものをレポートとして共有

全体 ・DAU バックエンド ・APM ・各種インフラのステータス

ネイティブ ・Firebase Crashlytics ・Firebase Performance ・Xcode Metrics ・アプリサイズ

データを一回で集める

サンプルで試せる

「ここに確認するだけでなく相互に起きうる影響に関するコミュニケーションをとる」

SLI/SLO SLI : サービスの可用性、品質を計測する指標 SLO: 核SLI

モバイルアプリの可用性 アプリケーションが利用可能でない状態の例

ユーザーのUXへの期待値

メッセージの読み込み速度 フリックできるまでの時間

カスタムキーの設定

トレース

パースエラーの検知

ユーザー問合せ調査のトレーサビリティ向上 ダイアログにエラーコードを記載

感想

オブザーバビリティの向上と聞くと一見難しそうに思えたが、実際はユーザーのことを考え一つ一つ指標を立てて継続的に改善していくということで自分でも少しずつできることがありそうだと思えた! FirebasePerformanceをまずは使いこなせるようにしたい

Ryo Tsuzukihashi