iOSDC2022 Day1 & Day2 参加記録
Day0に引き続きDay1&2のiwillblog Day0の記事はこちらから
全体の感想
2019年から連続4回目の参加となりました! 新卒でiOSエンジニアとなった自分が会社の先輩におすすめされて初めて参加したカンファレンスでした! 初めてのLTで岸川さんの発表を見て難しいけどとても感動したのを覚えています。 そんな自分もスピーカーとして参加できる日が来て感動しております(。•́ωก̀。)…グス 立木さん自分の名前を読んでいただきありがとうございます! 来年は現地参加したい
以下はそれぞれのセッションと感想
Swift Concurrency Next Step
おさらい
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でドット絵を描こう
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をまずは使いこなせるようにしたい