2017-08-06 96 views
0

我有一個非常簡單的iOS應用程序,它從Firebase中提取圖像,將它們添加到數組中,然後將它們放入帶有url會話的集合視圖中。只有一個問題,保存圖像集合視圖的視圖與主視圖是分開的視圖,因此每次用戶點擊視圖時,都會觀察內存使用情況。當你點擊後,內存不會改變。每次推送視圖時,內存使用量都會不斷上升。當我在主視圖中執行url會話之前,我從未遇到過這個問題,但現在我在單獨的視圖中遇到了問題。這裏是我的下載鏡像代碼:從URL下載圖像時發生內存泄漏

用於抓取圖像:

 let ref = firdatabase.dadatabase.reference 
ref.child("Pages").queryOrderedByKey.observeSingleEvent(type: .value, snapshot in 

if let pages = snapshot.value as? [String : AnyObject] { 
for (_, vale) in pages { 
let newPage = page() 
If let url = vale["url"] as? String { 
newpage.url = url 
pagers.append(new page) 
} 
} 
collection view.reloadData() 

)} 

nsurlsession:

if pagers.count != 0 { 
    let post = pagers[indexPath.row].url 
     let url = URL(string: post!) 
     let session = URLSession.shared.dataTask(with: url!, completionHandler: { (data, response, error) in 
      if let errer = error { 
       print(errer.localizedDescription) 
      } 

      DispatchQueue.main.async { 
       cell.imageViewPage.image = UIImage(data: data!) 
      } 
     })session.resume() 



    } 
    return cell 

現在,這裏的問題是,雖然,內存不斷上升,而不是下降過。

enter image description here

我真的需要你的幫助,以找到一個解決這個問題,因爲我不知道怎麼了,從未有過這個問題before.Thank你。我希望這個問題有一個簡單的解決方案。

+0

運行泄漏儀器查找泄漏的實例。 –

回答

0

我認爲你需要,一旦它完成,以避免內存無效會話任務查漏

urlSession.invalidateAndCancel() 
+0

在會話結束後,我嘗試了UrlSession.invalidateAndCancel(session),這給了我一個錯誤 –

+0

什麼是錯誤? –

+0

實例成員'invalidateAndCancel'不能用於'URLSession'類型;你的意思是使用這種類型的值嗎? –

1

目前尚不清楚,你內存泄漏。只是因爲內存使用量增加並不意味着你有內存泄漏。

如果您從遠程URL加載圖像並將它們保存在數組中,那麼您的內存使用將會增加。

如果您離開視圖控制器並放棄數組,並且您的內存使用量回落,則您沒有內存泄漏。

請注意,您的代碼正在將圖像安裝到表視圖/集合視圖單元中,但不會將它們保存在任何位置。這意味着如果用戶在屏幕外滾動一個單元格,然後滾動到它,您將再次下載它。

相反,我會建議編寫代碼將圖像作爲文件保存到磁盤。您可以創建文件URL的哈希值並將其用作文件名。檢查文件是否已經在磁盤上(可能位於應用程序的緩存目錄中),如果存在,則從磁盤加載。如果沒有,請使用URLSession下載對象,並在下載完成後將文件保存到緩存目錄中的哈希文件名中,然後將其安裝到目標單元中。

+0

好吧我從來沒有清除陣列一次我關閉視圖控制器,我想知道爲什麼當我關閉視圖時不清除內存 –

+0

誰擁有數組?您需要編輯您的問題以顯示管理圖像數組的代碼,並解釋您正在使用的視圖控制器的生命週期。 –

+0

嘿,我沒有更新這個問題 –