来自 URL 的 iOS CoreSpotlight 缩略图

原文 标签 ios swift alamofireimage corespotlight

我正在尝试构建一个使用 CoreSpotlight 使内容可在 iOS Spotlight 中搜索的测试应用程序。目前我已经设置为每当用户点击刷新按钮时它都会发出服务器请求然后 deleteAllSearchableItems然后 indexSearchableItems (可能不是最好的方法,但目前最简单,因为我仍处于弄清楚这一点的开始阶段)。

下面是我的代码。

var searchableItems: [CSSearchableItem] = []
for i in 0 ..< self._ids.count {
    let attributeSet = CSSearchableItemAttributeSet(itemContentType: kUTTypeItem as String)

    attributeSet.title = self._titles[i]
    attributeSet.contentDescription = self._descriptions[i]

    let searchableItem = CSSearchableItem(uniqueIdentifier: self._ids[i], domainIdentifier: "com.domain.appname", attributeSet: attributeSet)

    searchableItems.append(searchableItem)
}

CSSearchableIndex.default().deleteAllSearchableItems(completionHandler: { (error) -> Void in
    CSSearchableIndex.default().indexSearchableItems(searchableItems) { (error) -> Void in
        if error != nil {
            print(error?.localizedDescription ?? "Error")
        }
    }
})

我要做的下一件事是我有一组名为 self._images 的图像。 .该数组内部是空字符串( "" )或 URL 字符串( "https://mywebsite.com/image.png" )。

目前我可以使用下面的代码将 UIImageView 的图像设置为该 URL 处的图像,使用 AlamofireImage .
if (self._images[0] != "") {
    myImageView.af_setImage(withURL: URL(string: self._images[0])!)
}

如何将相同的图像放入 CoreSpotlight 属性集中?

我假设 attributeSet.thumbnailData.af_setImage(withURL: imagedownloadURL)不会工作。特别是因为它是异步的。

集成它的最简单方法是什么?

我已经尝试了一些事情,例如 for 循环等,但最大的问题是异步,我似乎无法找到解决方案来做到这一点,因为它是异步的,而且我有多个项目。

非常感谢您!

最佳答案

最简单的解决方案,但不是最好的...

DispatchQueue.global(qos: .userInitiated).async {
    var searchableItems: [CSSearchableItem] = []
    for i in 0 ..< self._ids.count {
        let attributeSet = CSSearchableItemAttributeSet(itemContentType: kUTTypeItem as String)
        attributeSet.title = self._titles[i]
        attributeSet.contentDescription = self._descriptions[i]
        let searchableItem = CSSearchableItem(uniqueIdentifier: self._ids[i], domainIdentifier: "com.domain.appname", attributeSet: attributeSet)

        if let imageUrl = URL(string: self._images[i]) {
            let urlRequest = URLRequest.init(url: imageUrl)
            if let cashedImage = UIImageView.af_sharedImageDownloader.imageCache?.image(for: urlRequest, withIdentifier: nil) {
                if let data = UIImageJPEGRepresentation(cashedImage, 1.0) {
                    attributeSet.thumbnailData = data
                }
            } else {
                if let data = NSData.init(contentsOf: imageUrl) {
                    attributeSet.thumbnailData = data as Data
                    if let image = UIImage.init(data: data as Data) {
                        let urlRequest = URLRequest.init(url: imageUrl)
                        UIImageView.af_sharedImageDownloader.imageCache?.add(image, for: urlRequest, withIdentifier: nil)
                    }
                }
            }
        }
        searchableItems.append(searchableItem)
    }

    CSSearchableIndex.default().deleteAllSearchableItems(completionHandler: { (error) -> Void in
        CSSearchableIndex.default().indexSearchableItems(searchableItems) { (error) -> Void in
            if error != nil {
                print(error?.localizedDescription ?? "Error")
            }
        }
    })
}

已编辑

为什么不是好的解决方案? 为了避免异步问题,我只是将所有内容都放在一个异步闭包中并进行同步图像下载。

更新

添加了默认的 Alamofire 兑现,在下载之前首先查看兑现的图像。

关于来自 URL 的 iOS CoreSpotlight 缩略图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44103197/

相关文章:

ios - Facebook iOS应用邀请已发送,但用户未收到

ios - 如何通过tableView从字典中获取选定的值?

ios - Xcode Swift暂停和恢复动画

ios - 编辑UITextField时会重置UIScrollView

ios - ABAddressBookCopyPeopleWithName在模拟器上返回空数组

ios - 不推荐使用++,它将在3中 swift 删除。

objective-c - 通过游戏中心发送NSString

ios - 带有UITableView单元格的Swift 4 AlamofireImage

swift - 如何使用Alamofire Image在swift中添加UIActivity指示器

swift - 使用AlamoFireImage在CollectionView中使用.af_setImage方法加载数组网址的 fatal error