swift - 更好的替代 DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) 用于数据刷新
问题描述
我正在寻找更好的替代方法DispatchQueue.main.asyncAfter(deadline: .now() + 0.5
来刷新我的数据。
我的数据是动态的,并且会根据用户操作而变化,重要的是用户看到的数据始终是最新的。
我正在使用 Firebase 实时数据库,我想知道是否可以随时更改我的服务文件以重新获取数据。这是我的服务文件:
class Service {
static let shared = Service()
let BASE_URL = "https://firebaseurl.com/jsondata.json"
let calendar = Calendar.current
func fetchClient(completion: @escaping ([Calls]) -> ()) {
guard let url = URL(string: BASE_URL) else { return }
URLSession.shared.dataTask(with: url) { (data, response, error) in
// handle error
if let error = error {
print("Failed to fetch data with error: ", error)
return
}
guard let data = data else {return}
do {
let myDecoder = JSONDecoder()
myDecoder.dateDecodingStrategy = .secondsSince1970
let calls = try myDecoder.decode([Calls?].self, from: data).filter({
self.calendar.isDateInToday($0?.dateTime ?? Date(timeIntervalSinceReferenceDate: -123456789.0))
})
completion(calls.filter{$0?.callmade != true}.compactMap{ $0 })
} catch let error {
print("Failed to create JSON with error: ", error)
}
}.resume()
}
}
目前在我的主控制器中我正在使用:
func fetchClient() {
Service.shared.fetchClient { (client) in
DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) {
self.client = client
self.collectionView.reloadData()
self.fetchClient()
}
}
}
解决方案
推荐阅读
- java - 在 python3 中上传文件异常使用“请求”模块
- mysql - 如何使用 where 和 or_where 在 CodeIgniter 中编写参数化查询
- php - Laravel Cache - 尝试从关闭的 MaxMind 数据库中读取
- google-apps-script - 如何从 UIPath 获取授权码
- c++ - 模板转换运算符问题
- reactjs - 如何将接口对象和其他类型的对象传递给 React 中的功能组件?
- machine-learning - TfidfVectorizer 返回空元素
- java - 将图像保存到 webapp 文件夹 Servlet 项目 IntelliJ
- sql - 用于从日期不匹配的不同列更新表中的开始和结束日期的 SQL 查询
- nginx - Nginx REGEX 文件名太长