2015-01-16 58 views
0

我使用集合視圖來顯示存儲在CoreData中的圖像,只有少數(大約15),但當我向下滾動它時滯,它的接縫是因爲我不是異步獲取我的數據,是否有可能只有15 UIImages?異步獲取Swift Xcode

因此,這裏是我的問題我無法找到一個關於在任何地方快速異步獲取異步獲取教程的教程,3天我在尋找。對不起,如果我沒有好好搜索。

這是抵達做的教程一些位

let entity = NSEntityDescription.entityForName("Dreams", inManagedObjectContext: contxt) 

    let fetchRequest = NSFetchRequest() 
    fetchRequest.entity = entity 

    let asyncFetch = NSAsynchronousFetchRequest(fetchRequest: fetchRequest) { 
     (result:NSAsynchronousFetchResult!) -> Void in 

     if result.finalResult!.count > 0 { 
      self.dreams = result.finalResult! as [Dream] 
     } 
     NSLog("Done.") 
    } 

夢想的類型[夢]數組但是當我顯示集合視圖沒有出現 這是我做到了以前

let fetchRequest = NSFetchRequest(entityName: "Dreams") 

    if let fetchResults = contxt.executeFetchRequest(fetchRequest, error: nil) as? [Dream] { 
     dreams = fetchResults 
    } 

效果很不錯,

非常感謝您的幫助

+0

異步提取可能會有幫助,但可能不會。這取決於代碼的結構,因此異步可能是關鍵,或者可能浪費時間。例如,你在哪裏執行這些提取?你是爲每個圖像進行單獨提取,還是批量提取?這些圖像是否實際存儲在持久性存儲或外部文件中? –

+0

如果可能,不要將圖像存儲在覈心數據中,只需存儲圖像和/或文件路徑的名稱 – Ian

+0

現在,我將圖像作爲NSData存儲在CoreData中,我在視圖中提取了圖像,並且沒有使用批處理我會嘗試你的建議(文件路徑) –

回答

1

不幸的是,我沒有時間在這個例子中提供特定的代碼。不過,我確實想提出一個基本的策略。在主線程中抓取這些信息極不可能成爲您的問題,但是一次性獲取所有內容肯定可能是,尤其是涉及大量的二進制數據時。如果出現以下情況,應該加快顯着性:

  1. 您開始使用具有良好批處理大小而不是原始獲取請求的NSFetchedResultsController。 NSFetchedResultsController對集合視圖的更新有點挑剔,它超出了這個問題的具體範圍,但是一旦設置正確,它們就可以很好地工作。
  2. 您將圖像存儲爲文件而不是核心數據本身,並將路徑存儲到文件中。然後,每次在對象發生故障時,圖像數據都不會被加載到內存中,並且可以使用該文件URL簡單地加載和顯示圖像。

堅持要在Core Data中存儲二進制數據的人通常會發現,將數據作爲唯一屬性存儲在單獨的「Image」實體中,並與您正在顯示的實體有關係。因此,即使您爲集合視圖獲取的對象位於內存中,圖像對象(及其二進制圖像數據)也可能會保留爲錯誤,因此不在內存中。然而,我更喜歡不將它們存儲在覈心數據中,只是簡單地處理由此產生的原子性陷阱以及文件核心數據指向被刪除的可能性。