2016-11-12 23 views
0

獲取彙總數據時,我試圖獲取由給定列分組數據拋出。當我有數據時它運作良好。我想在沒有數據的情況下處理這個案例,因爲它引發了一個NS錯誤,我無法在快速捕獲塊中捕獲這個錯誤。我已經看到了創建一個ObjC包裝的答案,但我不適用於我的情況,因爲我需要返回一個String數組。如何處理NSInvalidArgumentException從空的持久存儲

let request = self.fetchRequest() 
request.propertiesToGroupBy = [attribute] 
request.propertiesToFetch = [attribute] 
request.resultType = NSFetchRequestResultType.dictionaryResultType 
request.returnsDistinctResults = true 

if let results = try? context().fetch(request), // raises exception in testing, but runs fine when run on simulator. 
    let dics = results as? [NSDictionary] { 
    var resultsArray: [Any] = [] 
    for dic in dics { 
    if let propValue = dic[attribute] { 
     resultsArray.append(propValue) 
    } 
    } 
    return resultsArray 
} 

我該怎麼做?

+0

直到我找到一個真正的解決方案,繼續前進,我會兩次取。首先檢查是否有任何數據,然後運行實際的提取。如果沒有數據,則初始化爲空數組。 –

回答

0

建議將核心數據讀取行總是包含在do - catch塊中,因爲成功時它會可靠地返回指定返回類型的非可選數組。

斯威夫特得到了一個強大的類型系統。鑄造到未指定Any或基金類型NSDictionary不利於編譯器,可能會引起不必要的編譯器錯誤。

假設字典的鍵和值都是String,將字典轉換爲Swift類型[String:String]。強制打開字典是絕對安全的,因爲在運行時無法更改Core Data模型。

flatMap返回其不是nil所有值的非可選陣列。

var resultsArray = [String]() 
do { 
    let results = try context().fetch(request) as! [[String:String]] 
    resultsArray = results.flatMap {$0[attribute] as? String}  
} catch { 
    print(error) 
} 
return resultsArray 
+0

我做了do-try-catch,但問題是拋出的異常,swift無法捕捉它,因爲它是ObjC類型的異常。 'fetch()'調用拋出它。它可以在模擬器上運行,但我擔心它將來會很容易中斷,這就是爲什麼我想讓它通過我的集成測試。我確實找到了解決辦法,但我會將其作爲答案發布,如果我浪費了時間,我很抱歉。 –

0

在此基礎上answer

目前尚不明顯,我認爲它可以這樣做:

let request = self.fetchRequest() 

request.propertiesToGroupBy = [attribute] 
request.propertiesToFetch = [attribute] 
request.resultType = NSFetchRequestResultType.dictionaryResultType 
request.returnsDistinctResults = true 


var result: [Any] = [] 
do { 
    try ObjC.catchException { 
    let results = try? context().fetch(request) 
    if let dics = results as? [NSDictionary] { 
     var resultsArray: [Any] = [] 
     for dic in dics { 
     if let propValue = dic[attribute] { 
      resultsArray.append(propValue) 
     } 
     } 
     result = resultsArray 
    } 
    } 
} catch {} 
return result 

理想我想數組由ObjC.catchException不幸的是我已經被退回還沒有紮實的掌握ObjC。 result變種的範圍看起來太寬,我歡迎任何改進它的建議。

我希望把一切都在迅速的均勻性,但我想我堅持用這個解決方案現在。