2016-02-08 27 views
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 
} 
+0

我會降低規模,看看是否有幫助 –

+0

@DavidYangLiu從3倍減少到2倍的規模確實提高了內存使用量,從130 MB到85 MB。但圖像不是很清晰。我不認爲這是一個理想的解決方案,但謝謝你的建議。 – mantov1

+0

yea蓓蕾不認爲你可以擁有你的蛋糕並且也可以吃它..它可以讓你記住所有這些,或者你減少了圖像的分辨率。或者最後一件事是在加載完成時使圖像的負載異步並在屏幕上顯示它。但是如果使用滾動通過單元格取消所有正在進行的工作。這樣你就不必緩存圖像了,但是你可以在滾動時運行空圖像,然後填寫 –

回答

0

我結束了使用不同的緩存框架。 FastImageCache允許我以極佳的滾動性能和低內存使用率實現期望的結果,因爲圖像不存儲在內存中,而是存儲在磁盤上(這是FastImageCache的工作原理)。