2
嗨,我使用MKMapSnapshotter生成地圖圖像並使用SDWebImage緩存它們。地圖圖像將顯示在每個可用視圖單元中。UITableView與許多圖像高內存使用率
我遇到的問題是大約30個uitableview單元使用的內存是130 MB,如果我不使用地圖圖像,使用的內存是25 MB,最後使用地圖圖像但沒有緩存(如在生成每次顯示單元格時的地圖圖像)使用的內存爲50 MB。
如何減少內存使用量?或者我如何存儲圖像,以便佔用更少的內存空間?任何幫助,將不勝感激。 我的代碼如下。
在類的頂部:
var imageCache: SDImageCache!
var mySnapOptions: MKMapSnapshotOptions!
let regionRadius: CLLocationDistance = 300
let queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0)
在viewDidLoad中():
imageCache = SDImageCache(namespace: "myNamespace")
mySnapOptions = MKMapSnapshotOptions()
mySnapOptions.scale = UIScreen.mainScreen().scale
而且在cellForRow:
override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath, object: PFObject?) -> TableViewCell? {
let cell = tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath) as! TableViewCell
if let post = object {
cell.mapImageView.image = UIImage(named: "MapPlaceholder")
let tempLoc = post["location"] as! PFGeoPoint
let loc = CLLocation(latitude: tempLoc.latitude, longitude: tempLoc.longitude)
imageCache.queryDiskCacheForKey(post.objectId, done: {(image: UIImage?, cacheType: SDImageCacheType!) in
if let cachedImage = image {
cell.mapImageView.image = cachedImage
}else {
cell.mapPinImageView.hidden = true
cell.mapActivityIndicator.startAnimating()
dispatch_async(self.queue) {() -> Void in
self.mySnapOptions.region = MKCoordinateRegionMakeWithDistance(loc.coordinate,
self.regionRadius * 2.0, self.regionRadius * 2.0)
self.mySnapOptions.size = (cell.mapImageView.image?.size)!
MKMapSnapshotter(options: self.mySnapOptions).startWithCompletionHandler { snapshot, error in
guard let snapshot = snapshot else {
print("Snapshot error: \(error)")
return
}
self.imageCache.storeImage(snapshot.image, forKey: post.objectId, toDisk: true)
dispatch_async(dispatch_get_main_queue(), {
cell.mapActivityIndicator.stopAnimating()
cell.mapImageView.image = snapshot.image
cell.mapPinImageView.hidden = false
})
}
//
}
}
})
}
return cell
}
我會降低規模,看看是否有幫助 –
@DavidYangLiu從3倍減少到2倍的規模確實提高了內存使用量,從130 MB到85 MB。但圖像不是很清晰。我不認爲這是一個理想的解決方案,但謝謝你的建議。 – mantov1
yea蓓蕾不認爲你可以擁有你的蛋糕並且也可以吃它..它可以讓你記住所有這些,或者你減少了圖像的分辨率。或者最後一件事是在加載完成時使圖像的負載異步並在屏幕上顯示它。但是如果使用滾動通過單元格取消所有正在進行的工作。這樣你就不必緩存圖像了,但是你可以在滾動時運行空圖像,然後填寫 –