2016-11-12 22 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变种的范围看起来太宽,我欢迎任何改进它的建议。

我希望把一切都在迅速的均匀性,但我想我坚持用这个解决方案现在。