【问题标题】:How to correctly use MDQuerySetSortComparatorBlock in swift?如何在swift中正确使用MDQuerySetSortComparatorBlock?
【发布时间】:2022-10-16 06:57:52
【问题描述】:

我的代码:

//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>>>') 到 不相关的类型“日期”总是失败

【问题讨论】:

  • Unmanaged 总是那么有趣。我认为您必须致电.takeRetainedValue().takeUnretainedValue()。我猜是前者。所以我想应该是if let date1 = $0?.pointee?.takeRetainedValue() as? Date
  • @ChipJarred 谢谢,它有效!将其发布为答案)
  • 我会去做的。我很高兴我的猜测是正确的(或者至少是正确的),尽管是一个模糊的消息。

标签: swift macos spotlight mdquery


【解决方案1】:

我总是不得不花时间查找与Unmanaged 的交易是什么,因为我很少需要它。显然,我基于上次遇到 Unmanaged 为 OP 工作的模糊记忆在 cmets 中猜测它,所以我把它放在这里。基本上,它归结为使用其.pointee 属性取消引用指针,然后在其上调用.takeRetainedValue(),并在两者之间进行适当的可选解包。

MDQuerySetSortComparatorBlock(query)
{
    guard let 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
}

【讨论】:

    猜你喜欢
    • 2020-03-25
    • 1970-01-01
    • 2017-03-22
    • 1970-01-01
    • 2018-08-21
    • 1970-01-01
    • 1970-01-01
    • 2019-04-09
    • 1970-01-01
    相关资源
    最近更新 更多