2017-09-16 8 views
0

私は長いバックグラウンド操作を行いたい、完了後に、私はテーブルビューグランドセントラルタスク完了のため発送は、チェック

let globalQueue = DispatchQueue.global() 
       globalQueue.async { 
        //My lengthy code 
       } 

をリフレッシュする必要がある非同期タスクが

treeview.reloadData() 
を完了した後、私はこれを行う必要があります

GCDのタスク完了イベントにどのようにフックできますか?私はC#の背景を持っています、私はSWIFTに新しいです。アドバイスをお願いします。

答えて

3

あなたは自分のコードの後mainキューに配置する必要があります。

let globalQueue = DispatchQueue.global() 
globalQueue.async { 
    // Your code here 
    DispatchQueue.main.async { 
     self.treeview.reloadData() 
    } 
} 
+0

はい、treeviewは私のUIにあります。 – techno

+0

実際に私は明示的にselfを定義する必要がありました: 'self.treeview.reloadData();' – techno

+0

@techno updated – paper1111

1

私はDispatchGroupを使用してお勧めします。グループを使用すると、依存関係を作成し、すべてが完了したときに通知を受け取ることができます。

// create a group to synchronize our tasks 
let group = DispatchGroup() 

// The 'enter' method increments the group's task count… 
group.enter() 
let globalQueue = DispatchQueue.global() 
globalQueue.async { 
    // my lengthy code 
    group.leave() 
} 

// closure will be called when the group's task count reaches 0 
group.notify(queue: .main) { [weak self] in 
    self?.tableView.reloadData() 
} 
+1

ありがとう、私はより単純なアプローチを使用することを好む。 – techno

+0

完全にそれを得る人。これは、別々のスレッドで複数のタスクを実行し、すべてのスレッドを待つ場合に便利です。 –

+0

ユーザーがButtonをクリックしたときに非同期タスクを取り消す必要があるため、GCDを使用できないようです。https://stackoverflow.com/questions/46904176/dismissing-view-controller-not-stoppingここをクリックしてください-async-task / – techno

関連する問題