私は最近、多くのバックグラウンド 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呼び出しを行うと(タスク完了ハンドラー用)、問題が発生する可能性がありますか?
明確なコメントやガイドは非常に役立ちます! もう本当にありがとう