SwiftUI-ObservableObjectのパフォーマンスの問題

ハンドリー

場合SwiftUIのView結合のObservableObject場合、ビューは自動的にリロードされる任意に関わらず変化が直接ビューに影響を与えるかどうかに-変化が観察物体内で起こります。

これは、重要なアプリのパフォーマンスに大きな問題を引き起こすようです。この簡単な例を参照してください。

// Our observed model
class User: ObservableObject {
    @Published var name = "Bob"
    @Published var imageResource = "IMAGE_RESOURCE"
}


// Name view
struct NameView: View {
    @EnvironmentObject var user: User
    
    var body: some View {
        print("Redrawing name")
        return TextField("Name", text: $user.name)
    }
}

// Image view - elsewhere in the app
struct ImageView: View {
    @EnvironmentObject var user: User
    
    var body: some View {
        print("Redrawing image")
        return Image(user.imageResource)
    }
}

ここでは、アプリのさまざまな部分にある2つの無関係なビューがあります。どちらもUser、環境によって提供される共有への変更を監視します。TextFieldを介しての名前NameViewを編集できますUserImageViewユーザーのプロフィール画像を表示します。

スクリーンショット

問題:内部の各キーストロークでNameViewこれを監視するすべてのビューUserは、ボディコンテンツ全体をリロードすることを余儀なくされます。これにはImageView、大きな画像のダウンロードやサイズ変更など、費用のかかる操作が含まれる場合があります。

これは、上記の例で簡単に証明できます。これは、TextFieldに新しい文字を入力するたびに"Redrawing name""Redrawing image"がログに記録されるためです。

質問:ビューの不必要な再描画を回避するために、Observable / Environmentオブジェクトの使用をどのように改善できますか?データモデルを構造化するためのより良い方法はありますか?

編集:

これが問題になる理由をわかりやすく説明するためにImageView、静止画像を表示するだけではないします。たとえば、次のようになります。

  • サブビューinitまたはonAppearメソッドによってトリガーされた画像を非同期的にロードする
  • 実行中のアニメーションが含まれています
  • ローカル状態管理を必要とするドラッグアンドドロップインターフェイスをサポートする

他にもたくさんの例がありますが、これらは私の現在のプロジェクトで遭遇したものです。これらの各ケースで、ビューbodyが再計算されると、破棄された状態になり、一部のコストのかかる操作がキャンセル/再開されます。

これがSwiftUIの「バグ」であるとは言えませんが、アプリを設計するためのより良い方法があれば、Appleやチュートリアルで言及されているのを見たことがありません。ほとんどの例は、副作用に対処せずに、EnvironmentObjectの自由な使用を支持しているようです。

ロブメイオフ

なぜオブジェクトImageView全体必要なのUserですか?

回答:そうではありません。

必要なものだけを取るように変更します。

struct ImageView: View {
    var imageName: String

    var body: some View {
        print("Redrawing image")
        return Image(imageName)
    }
}

struct ContentView: View {
    @EnvironmentObject var user: User

    var body: some View {
        VStack {
            NameView()
            ImageView(imageName: user.imageResource)
        }
    }
}

キーボードのキーをタップすると出力されます。

Redrawing name
Redrawing image
Redrawing name
Redrawing name
Redrawing name
Redrawing name

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

SwiftUI-ObservableObjectのパフォーマンスの問題

分類Dev

SwiftUIで1000要素のリストを作成するときのパフォーマンスの問題

分類Dev

SwiftUIで1000要素のリストを作成するときのパフォーマンスの問題

分類Dev

LazyHGridのフォーマットに関する問題-SwiftUI

分類Dev

WatchOSのNavigationLinksでSwiftUIリストのパフォーマンスが低下する

分類Dev

WatchOSのNavigationLinksでSwiftUIリストのパフォーマンスが低下する

分類Dev

パフォーマンスの問題

分類Dev

SwiftUIの間隔の問題

分類Dev

SwiftUIテキストフィールドのテキストの色の問題

分類Dev

SwiftUIテキストフィールドのテキストの色の問題

分類Dev

SwiftUI-CNContactViewControllerNavigationBarの問題

分類Dev

position()/ offset()swiftUIの問題

分類Dev

SwiftUI:パスのcoordinateSpace

分類Dev

SwiftUI:パスのcoordinateSpace

分類Dev

SwiftUIフォームのパディングを削除します

分類Dev

Rのループのパフォーマンスの問題

分類Dev

SwiftUI:アニメーション中のテキストの問題

分類Dev

SwiftUI:アニメーション中のテキストの問題

分類Dev

SwiftUIボタンのテキスト配置の問題

分類Dev

春の起動時のパフォーマンスの問題

分類Dev

matplotlibの凡例のパフォーマンスの問題

分類Dev

PageStorageKeyでのFlutterListViewのパフォーマンスの問題

分類Dev

VirtualBoxでのLinuxMintのパフォーマンスの問題

分類Dev

Burrows-PythonのWheelerのパフォーマンスの問題

分類Dev

Djangoの多対多のパフォーマンスの問題

分類Dev

SQLでのUNION句のパフォーマンスの問題

分類Dev

Where andContainsでのLINQtoEntitiesのパフォーマンスの問題

分類Dev

HikariCP での Postgresql のパフォーマンスの問題

分類Dev

NestJsテストのパフォーマンスの問題

Related 関連記事

  1. 1

    SwiftUI-ObservableObjectのパフォーマンスの問題

  2. 2

    SwiftUIで1000要素のリストを作成するときのパフォーマンスの問題

  3. 3

    SwiftUIで1000要素のリストを作成するときのパフォーマンスの問題

  4. 4

    LazyHGridのフォーマットに関する問題-SwiftUI

  5. 5

    WatchOSのNavigationLinksでSwiftUIリストのパフォーマンスが低下する

  6. 6

    WatchOSのNavigationLinksでSwiftUIリストのパフォーマンスが低下する

  7. 7

    パフォーマンスの問題

  8. 8

    SwiftUIの間隔の問題

  9. 9

    SwiftUIテキストフィールドのテキストの色の問題

  10. 10

    SwiftUIテキストフィールドのテキストの色の問題

  11. 11

    SwiftUI-CNContactViewControllerNavigationBarの問題

  12. 12

    position()/ offset()swiftUIの問題

  13. 13

    SwiftUI:パスのcoordinateSpace

  14. 14

    SwiftUI:パスのcoordinateSpace

  15. 15

    SwiftUIフォームのパディングを削除します

  16. 16

    Rのループのパフォーマンスの問題

  17. 17

    SwiftUI:アニメーション中のテキストの問題

  18. 18

    SwiftUI:アニメーション中のテキストの問題

  19. 19

    SwiftUIボタンのテキスト配置の問題

  20. 20

    春の起動時のパフォーマンスの問題

  21. 21

    matplotlibの凡例のパフォーマンスの問題

  22. 22

    PageStorageKeyでのFlutterListViewのパフォーマンスの問題

  23. 23

    VirtualBoxでのLinuxMintのパフォーマンスの問題

  24. 24

    Burrows-PythonのWheelerのパフォーマンスの問題

  25. 25

    Djangoの多対多のパフォーマンスの問題

  26. 26

    SQLでのUNION句のパフォーマンスの問題

  27. 27

    Where andContainsでのLINQtoEntitiesのパフォーマンスの問題

  28. 28

    HikariCP での Postgresql のパフォーマンスの問題

  29. 29

    NestJsテストのパフォーマンスの問題

ホットタグ

アーカイブ