新しいデータセットをダウンロードするよう通知する通知メッセージをアプリケーションに送信するバックエンドがあります。ユーザーが通知を受け取ると、アラートボックスはプッシュ通知スレッドで作成され、ユーザーにデータセットのダウンロードを受け入れるか拒否するかを尋ねます。ユーザーがダウンロードを受け入れると、非同期でデータがダウンロードされます。私がしたいのは、ダウンロードが完了したらテーブルビューを更新したいのです。しかし私は別のスレッド上にあり、そのスレッドからテーブルビューを更新する方法がわかりません。それ、どうやったら出来るの?別のスレッドからUITableViewControllerをリフレッシュする
func downloadContent(key: String, pinOnCompletion: Bool) {
let manager = AWSUserFileManager.defaultUserFileManager()
let content = manager.contentWithKey(self.prefix + key)
content.downloadWithDownloadType(
.IfNewerExists,
pinOnCompletion: pinOnCompletion,
progressBlock: {[weak self](content: AWSContent?, progress: NSProgress?) -> Void in
guard self != nil else { return }
/* Show progress in UI. */
},
completionHandler: {[weak self](content: AWSContent?, data: NSData?, error: NSError?) -> Void in
guard self != nil else { return }
if let error = error {
print("Failed to download a content from a server. \(error)")
return
}
if let fileData = data {
// Saves Data to core data here
// Update the tableViewController
}
print("Object download complete.")
})
}
更新-1 これはポストを複製されていません。提案された重複投稿は、tableviewcontrollerクラス内で非同期タスクからtableviewcontrollerを更新する方法を尋ねました。私の質問は別のクラスから別のスレッドからtableviewcontrollerを更新することです。
更新-2 だけ明確にする、ダウンロードマネージャクラス内でこのダウンロード機能はAmazonPushNotificationManagerを実装するクラスから呼び出されます。プッシュ通知を受信すると呼び出されます。だから私はUIスレッドではなく、私はダウンロードを呼び出すときではない。私は押さえつけの糸についている。補完ハンドラを渡すと、UIからではなくプッシュ通知スレッドからのものになります。私は2つのビューを持っています(1つはテーブルビューで、もう1つはUIViewControllerです)。プッシュ通知が受信されると、ユーザはどちらか一方にいる可能性があります。だから私はUIViewController上にいる場合、テーブルのデータをリロードしてはいけません。私は混乱しないと思う。
それは同じでした。もう1つの質問は、メインスレッドのテーブルをバックグラウンドスレッドから更新することでした。それはあなたが求めているのと同じことです。 – rmaddy
@rmaddy私は重複としてそれを見ることができません。私がダウンロードを開始すると、私はもうUIスレッドではありません。ダウンロードはプッシュ通知デリゲートから呼び出されます。 UIスレッドではなく、プッシュ通知デリゲートのバックグラウンドスレッドです。 – user30646
だからこそ、それは重複している。もう1つの問題は同じことをしていました - バックグラウンドスレッドでいくつかのコードを実行し、メインスレッドでUIを更新する必要がありました。答えは、メインスレッドのテーブルをバックグラウンドスレッドから更新する方法を示しました。それだけであなたがする必要があります。 – rmaddy