我的代碼:
//search all of applications
let queryString = "kMDItemContentTypeTree=com.apple.application"
// sort by last metadata change
let sorting = [kMDItemAttributeChangeDate] as CFArray
// create query and assign sorting param
let query = MDQueryCreate(kCFAllocatorDefault, queryString as CFString, nil, sorting)
// ISSUE HERE
// Set comparation block that called for sorting
MDQuerySetSortComparatorBlock(query, {
if let date1 = $0 as? Date,
let date2 = $1 as? Date {
return date1 < date2 ? .compareLessThan : .compareGreaterThan
}
return CFComparisonResult.compareEqualTo
})
MDQuerySetDispatchQueue(query, DispatchQueue(label: "background", qos: .background) )
MDQueryExecute(query, CFOptionFlags())
問題是以正確的方式撰寫 MDQuerySetSortComparatorBlock - 我不明白它必須如何撰寫
我看到警告:
從 'UnsafePointer<Unmanaged?>?' 轉換 (又名 'Optional<UnsafePointer<Optional<Unmanaged>>>')到不相關的型別 'Date' 總是失敗
uj5u.com熱心網友回復:
我總是不得不花時間查找交易的內容,Unmanaged因為我很少需要它。顯然我在評論中的猜測是基于我最后一次遇到Unmanaged為 OP 作業的模糊記憶,所以我把它放在這里。基本上,它歸結為使用其.pointee屬性取消參考指標然后呼叫.takeRetainedValue()它,并在兩者之間進行適當的可選解包。
MDQuerySetSortComparatorBlock(query)
{
guard let date1 = $0?.pointee?.takeRetainedValue() as? Date,
let date2 = $1?.pointee?.takeRetainedValue() as? Date
else
{
// Do you really want to treat non-dates as equal?
return .compareEqualTo
}
if date1 < date2 { return .compareLessThan }
return date1 == date2 ? .compareEqualTo : .compareGreaterThan
}
究竟如何處理強制轉換Date導致的可能性nil取決于您的應用程式,但一種可能性是進行比較,以便所有強制轉換Date失敗或指標真正nil位于的位置最后收集。
MDQuerySetSortComparatorBlock(query)
{
guard let date1 = $0?.pointee?.takeRetainedValue() as? Date else {
return .compareGreaterThan
}
guard let date2 = $1?.pointee?.takeRetainedValue() as? Date else {
return .compareLessThan
}
if date1 < date2 { return .compareLessThan }
return date1 == date2 ? .compareEqualTo : .compareGreaterThan
}
然后,當您獲得查詢結果時,您可以進行反向傳遞以洗掉具有無效日期的元素,而無需移動元素。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/517836.html
標籤:迅速苹果系统聚光灯查询
上一篇:如何執行與主cpp檔案位于同一位置的現有二進制檔案?
下一篇:創建表會出現“缺少右括號”錯誤
