Grand Central Dispatch 成长记忆
Grand Central Dispatch Growing Memory
概述:我正在创建一个 Swift 程序来下载实时 JSON 更新非常频繁(可能每秒几次)的数据,然后在 tableView 中将其显示给用户。当程序开始时,它使用 GCD 在一个单独的线程中进行下载,本质上是 运行 整个程序运行期间的线程 运行。
问题:程序很好地下载并显示了数据,但我注意到程序的内存(如 Xcode 调试导航器中所示)的增长速度比 JSON 数据输入快得多。几分钟之内就变成了几百 MB。
我从我的 'Coordinator' 对象调用 dispatch_async,该对象还存储我正在更新的实例变量集合。这是我的代码
func startDownload() {
dispatch_async(dispatch_get_global_queue(QOS_CLASS_USER_INITIATED, 0), {
while (true) {
self.myDataPipe.downloadMarketOdds(self.marketsToUpdate)
dispatch_sync(dispatch_get_main_queue(), {
self.referenceToViewController!.reloadUpComingMarketsTableView()
self.referenceToViewController!.reloadMainTableView()
})
}
} ) // end of dispatch_async
// end of start()
}
我是 GCD 的新手,已经在 Whosebug 上进行了一些搜索,但还没有找到任何有用的东西。有人可以指出我正确的方向或指出我明显遗漏的东西吗?
提前致谢!
最好的方法是从 Xcode 分析内存报告或通过 Instruments 获取更详细的信息。
我建议你使用自动释放池(强制释放所有自动释放的对象):
dispatch_async(dispatch_get_global_queue(QOS_CLASS_USER_INITIATED, 0), {
while (true) {
autoreleasepool {
self.myDataPipe.downloadMarketOdds(self.marketsToUpdate)
dispatch_sync(dispatch_get_main_queue(), {
self.referenceToViewController!.reloadUpComingMarketsTableView()
self.referenceToViewController!.reloadMainTableView()
})
}
}
} )
或者通过GCD定时器下载数据:
let interval = 5.0 // seconds
let queue = dispatch_get_global_queue(QOS_CLASS_USER_INITIATED, 0)
let timer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0, queue)
dispatch_source_set_timer(timer, dispatch_time(DISPATCH_TIME_NOW, interval * NSEC_PER_SEC), interval * NSEC_PER_SEC, (1ull * NSEC_PER_SEC) / 10)
dispatch_source_set_event_handler(timer, {
self.myDataPipe.downloadMarketOdds(self.marketsToUpdate)
dispatch_sync(dispatch_get_main_queue(), {
self.referenceToViewController!.reloadUpComingMarketsTableView()
self.referenceToViewController!.reloadMainTableView()
})
})
dispatch_resume(timer)
概述:我正在创建一个 Swift 程序来下载实时 JSON 更新非常频繁(可能每秒几次)的数据,然后在 tableView 中将其显示给用户。当程序开始时,它使用 GCD 在一个单独的线程中进行下载,本质上是 运行 整个程序运行期间的线程 运行。
问题:程序很好地下载并显示了数据,但我注意到程序的内存(如 Xcode 调试导航器中所示)的增长速度比 JSON 数据输入快得多。几分钟之内就变成了几百 MB。
我从我的 'Coordinator' 对象调用 dispatch_async,该对象还存储我正在更新的实例变量集合。这是我的代码
func startDownload() {
dispatch_async(dispatch_get_global_queue(QOS_CLASS_USER_INITIATED, 0), {
while (true) {
self.myDataPipe.downloadMarketOdds(self.marketsToUpdate)
dispatch_sync(dispatch_get_main_queue(), {
self.referenceToViewController!.reloadUpComingMarketsTableView()
self.referenceToViewController!.reloadMainTableView()
})
}
} ) // end of dispatch_async
// end of start()
}
我是 GCD 的新手,已经在 Whosebug 上进行了一些搜索,但还没有找到任何有用的东西。有人可以指出我正确的方向或指出我明显遗漏的东西吗?
提前致谢!
最好的方法是从 Xcode 分析内存报告或通过 Instruments 获取更详细的信息。
我建议你使用自动释放池(强制释放所有自动释放的对象):
dispatch_async(dispatch_get_global_queue(QOS_CLASS_USER_INITIATED, 0), {
while (true) {
autoreleasepool {
self.myDataPipe.downloadMarketOdds(self.marketsToUpdate)
dispatch_sync(dispatch_get_main_queue(), {
self.referenceToViewController!.reloadUpComingMarketsTableView()
self.referenceToViewController!.reloadMainTableView()
})
}
}
} )
或者通过GCD定时器下载数据:
let interval = 5.0 // seconds
let queue = dispatch_get_global_queue(QOS_CLASS_USER_INITIATED, 0)
let timer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0, queue)
dispatch_source_set_timer(timer, dispatch_time(DISPATCH_TIME_NOW, interval * NSEC_PER_SEC), interval * NSEC_PER_SEC, (1ull * NSEC_PER_SEC) / 10)
dispatch_source_set_event_handler(timer, {
self.myDataPipe.downloadMarketOdds(self.marketsToUpdate)
dispatch_sync(dispatch_get_main_queue(), {
self.referenceToViewController!.reloadUpComingMarketsTableView()
self.referenceToViewController!.reloadMainTableView()
})
})
dispatch_resume(timer)