Hen*_*ies 5 ios firebase swift alamofire
这是我在这里的第一个问题,所以对我来说很容易!
我是一名新手编码器,我正在尝试循环使用JSON,解析数据并将信息备份到我的Firebase服务器 - 使用Alamofire请求JSON信息.
Swift 4,Alamofire 4.5.1,Firebase 4.2.0
该过程有效 - 但并非没有无限增加设备内存使用和高达200%的CPU使用率.通过注释掉行,我在我的数据提取功能中将内存和CPU使用率单独下放到Firebase上传setValue行 - 它遍历未知长度的JSON数据库(通过一次最多拉1000行数据 - 因此增加偏移值).我从中提取信息的数据库非常庞大,随着内存使用量的增加,该函数的速度非常慢.
该函数检测是否找到了空JSON(结果的结尾),然后结束或解析JSON,将信息上传到Firebase,将偏移值增加1000行,然后使用新的偏移值重复自身.
var offset: Int! = 0
var finished: Bool! = false
func pullCities() {
print("step 1")
let call = GET_CITIES + "&offset=\(self.offset!)&rows=1000"
let cityURL = URL(string: call)!
Alamofire.request(cityURL).authenticate(user: USERNAME, password: PASSWORD).responseJSON { response in
let result = response.result
print("step 2")
if let dict = result.value as? [Dictionary<String, Any>] {
print("step 3")
if dict.count == 0 {
self.finished = true
print("CITIES COMPLETE")
} else {
print("step 4")
for item in dict {
if let id = item["city"] as? String {
let country = item["country"] as? String
let ref = DataService.ds.Database.child("countries").child(country!).child("cities").child(id)
ref.setValue(item)
}
}
self.finished = false
print("SUCCESS CITY \(self.offset!)")
self.offset = self.offset! + 1000
}
}
if self.finished == true {
return
} else {
self.pullCities()
}
}
}
Run Code Online (Sandbox Code Playgroud)
在我看来,上传到Firebase的数据正在某个地方保存,一旦上传完成就不会被清空?虽然在网上搜索时找不到关于此问题的大量信息.
我试过的事情:
重复,虽然功能(没有好处,因为我只想要每个循环1次有效重复 - 并且仍然具有高内存,CPU使用率)
性能监控(Xcode调用树发现"CFString(不可变)"和"__NSArrayM"是内存使用量飙升的主要原因 - 两者都与上面的setValue行有关)
内存使用情况图表(很清楚,当它循环回来时,来自此函数的内存不会被清空 - 内存完全没有减少)
autoreleasepool阻止(根据建议,不成功)
已启用整个模块优化(根据建议,不成功)
任何帮助将不胜感激!
UPDATE
下图是单次循环后的分配图(1,000行数据).它表明可能发生的事情是Firebase正在缓存结果字典中每个项目的数据,但似乎只在每次上传完成后将内存解除分配为一个整体块?理想情况下,它应该在每次成功上传后取消分配,而不是一次全部取消分配.如果有人能就此提出一些建议,我将非常感激!
最终更新
如果有人应该遇到同样的问题,我找不到解决方案.我的要求发生了变化,所以我将代码切换到了nodejs,它运行完美.HTTP请求也非常容易在javascript上编码!
我在处理外部网站上的数据时遇到了类似的问题,解决该问题的唯一方法是将循环包装在 autoreleasepool {} 块中,这会强制在每次迭代时清除内存。鉴于 ARC,您可能认为 Swift 中不需要这样的结构,但请参阅以下 SO 讨论:
Swift程序中有必要使用autoreleasepool吗?
希望有帮助。
| 归档时间: |
|
| 查看次数: |
620 次 |
| 最近记录: |