1

私は最近、多くのバックグラウンド HTTP タスクを処理し、UI だけでなく、応答データに従って現在のセッションの静的データ (多くの配列、変数など) を更新する Swift を使用して iOS アプリケーションを開発しました。私は iOS 開発の新人としてカウントされる可能性があり、混乱する点がいくつかあります。

バックグラウンド タスクからの UI の更新は、GCD API を介して処理されます。私は常にこれらの更新を次の方法で処理してきました。

dispatch_async(dispatch_get_main_queue, {
    // Update UI
})

シナリオを示して、私の主張を明確にしましょう。

UITableView サブビューを持つビュー コントローラーがあります。このテーブル ビューには、何かのリストが表示されます (ユーザー名としましょう)。NSURLSessionDataTask を準備して再開しました。

let request = NSMutableURLRequest(URL: someURL)
let task = NSURLSession.sharedSession().dataTaskWithRequest(request) {
    data, response, error in

    // Handle error case
    // Parse data, and receive a user list
    // AppData.userList = parsed list
    // Update table view
}

私のテスターの何人かは、ディスパッチ呼び出しと実行ループに関連するいくつかのクラッシュに直面しており、その背後にある理由を見つけることができませんでした。これは私のディスパッチコールに関連していると思います。今、私はこれのために私のデザインを再考しています.ここに私の質問があります:

  • httpタスクの完了ハンドラーでメインキューのdispatch_async呼び出しの内側と外側で静的データ(配列、辞書など)を更新することの違いは何ですか(私のデータの更新後、とにかくディスパッチ呼び出し内でUIが更新されます)?. 配列からの読み取り、配列への挿入、または配列からの削除中に、バックグラウンド スレッドのスレッド セーフを確保するにはどうすればよいですか?
  • クロージャー内でdispatch_async呼び出しを行うと(タスク完了ハンドラー用)、問題が発生する可能性がありますか?

明確なコメントやガイドは非常に役立ちます! もう本当にありがとう

4

2 に答える 2