我有一个应用程序,不断从我的服务器读取数据,并在UI中更新数据。它提取相当多的数据,构建一些数据结构,然后将信息传递给UI。下面的代码显示了我如何收集数据:
class Server {
private var units: [Unit] = []
...
init {
// I pull data from a firebase realtime database here using the observe method
// which triggers the callback everytime the data changes
// 'data' is a big dictionary of dictionarys which will be sorted into objects
FirebaseDatabaseHandler.getServerInfo(serverAddress: address, callback: { data in
// Because its a lot of data sorting it is hefty so I do this on a background thread
// 'updateQueue' is a single static DispatchQueue that I create in AppDelegate for now
AppDelegate.updateQueue.async {
// here I create an array of data objects using the JSON I pulled from firebase
// then I set the "units" variable of this object and call my update callback
// which triggers a UI update on the main thread
if let unitData = (data?["units"] as? [String:Any]) {
var unitsArray = [Unit]()
for key in unitData.keys {
unitsArray.append(Unit(address: key.base64Decode, data: unitData[key] as! [String:Any]))
}
self.units = unitsArray
self.updateCallback()
}
}
})
}
...
上面的代码工作得很好,但是内存不断构建并且没有被正确释放,运行约10-20分钟后,应用程序构建高达2GB的内存并从内存耗尽而崩溃。
如果我摆脱AppDelegate.updateQueue.async { }
,只是让这段代码在主线程上运行,内存确实被清除,没有崩溃,内存保持在50-200mb左右,但是如果我这样做,UI基本上是永久冻结的,因为主线程上正在发生多少处理
我尝试使用调试器来观察我的units
数组和我的Server
对象的大小,但无论应用程序运行多长时间,大小都不会增长。
有什么我可以做的调试这个,或任何原因为什么内存不会得到清除,当我从后台线程运行它?
Add [weak self]:
FirebaseDatabaseHandler.getServerInfo(serverAddress: address, callback: {[weak self] data in
AppDelegate.updateQueue.async { [weak self] in
请注意,您将需要做更多的调整,因为self将成为可选的。