gpt4 book ai didi

ios - 从另一个线程刷新 UITableViewController

转载 作者:行者123 更新时间:2023-11-28 10:16:12 27 4
gpt4 key购买 nike

我有后端向我的应用程序发送通知消息以通知用户下载新数据集。当用户收到通知时,在推送通知线程中创建警告框,询问用户接受或拒绝数据集下载。如果用户接受下载,它会异步下载数据。我想要做的是,我想在下载完成后刷新表格 View 。但我在不同的线程上,我不知道如何从该线程更新 Tableview。我该怎么做?

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。我有两个 View (一个是 Tableview,另一个是 UIViewController)。收到推送通知时,用户可以使用其中任何一个。因此,如果用户在 UIViewController 上,我不应该重新加载表数据。我希望这听起来不会令人困惑。

最佳答案

正如其他人所说,您不会从后台线程更新 UI 对象,例如 TableView Controller 。这是明确禁止的。

您想要做的是在您的下载管理器类中编写一个函数(如果这是该类),它接受一个完成处理程序。编写您的 downloadContent 函数,以便在下载完成后调用完成处理程序。我在 Github 上有一个名为 Async_demo 的示例项目(链接),它演示了这种技术。 (这个项目是用 Swift 3 编写的。此时你应该在 Swift 3 中进行新的开发。既然 Swift 3 已经发布,你为什么要问 Swift 2?)

关键函数是这样的:

  /**
This function demonstrates handling an async task.
- Parameter url The url to download
- Parameter completion: A completion handler to execute once the download is finished
*/


func downloadFileAtURL(_ url: URL, completion: @escaping DataClosure) {

//We create a URLRequest that does not allow caching so you can see the download take place
let request = URLRequest(url: url,
cachePolicy: .reloadIgnoringLocalAndRemoteCacheData,
timeoutInterval: 30.0)
let dataTask = URLSession.shared.dataTask(with: request) {
//------------------------------------------
//This is the completion handler, which runs LATER,
//after downloadFileAtURL has returned.
data, response, error in

//Perform the completion handler on the main thread
DispatchQueue.main.async() {
//Call the copmletion handler that was passed to us
completion(data, error)
}
//------------------------------------------
}
dataTask.resume()

//When we get here the data task will NOT have completed yet!
}


关于ios - 从另一个线程刷新 UITableViewController,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41193703/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com