我的应用程序相当多地使用 firebase 的observeSingleEventOfType,我开始意识到我的应用程序的内存随着时间的推移而增加。我已经注释掉了所有代码,除了调用以下函数的测试按钮。
func loadPostsTest() {
FIRDatabase.database().reference().child("posts").observeSingleEventOfType(.Value, withBlock: { (snapshot: FIRDataSnapshot) in
print(snapshot.value)
})
}
当程序启动时,我以大约每秒 2.3 次的速度按下测试按钮,观察内存图表,如下所示。内存会增加,并且在请求后不会恢复。从长远来看,这个问题对我的应用程序产生了相当大的影响,因为我的应用程序的内存会因此从 70mb 增长到 150+mb。这有什么原因吗?
请注意,短暂的五秒休息是我停下来确保所有“快照”都打印出来。
注 2...当我停止按下按钮时,内存保持在“短暂休息部分”所示的相同水平。以防万一您认为它会无限期地自行增长
- - - -更新 - - - - -
为了进一步确认问题,我创建了一个全新的项目,其中除了 firebase import 之外什么都没有,故事板中的一个按钮包含以下代码,并在我的 6 上进行模拟(在模拟器上模拟似乎没有这个问题)。下图证明 Firebase 存在一些可疑之处,因为我的内存在一分钟左右的时间内从 11.1mb 增加到 17.3mb,并有 303 个请求。
import UIKit
import Firebase
class ViewController: UIViewController {
var count: Int = 0
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
}
@IBAction func testBtnPressed(sender: AnyObject) {
FIRDatabase.database().reference().child("posts").observeSingleEventOfType(.Value, withBlock: {[weak self] (snapshot: FIRDataSnapshot) in
print(self?.count)
self?.count += 1
})
}
这可能只是因为您正在调试版本上运行而发生。在调试版本的设备上点击约 128 次后,我的结果是:
正如您所看到的,绝大多数内存消耗是由于与调试相关的性能工具造成的。如果您想确认此功能,可以通过编辑方案来禁用此功能:
然后禁用回溯记录:
禁用它后,同样的约 128 次点击基本上没有增长:
当然,您可能不想禁用该功能,因为您可能会发现它对于诊断调试版本中的崩溃和其他问题很有用。不过,在发布版本中这不应该是问题!
作为参考,这是我正在运行的代码:
import UIKit
import FirebaseDatabase
class ViewController: UIViewController {
@IBOutlet weak var label: UILabel!
private var count: Int = 0
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
}
@IBAction func testBtnPressed(sender: AnyObject) {
let db = FIRDatabase.database().reference()
db.child("posts").observeSingleEventOfType(.Value) { [weak self] (snap: FIRDataSnapshot!) in
guard let this = self else { return }
this.count = this.count + 1
this.label.text = "\(this.count)"
}
}
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)