来自网址

时间:2017-05-22 00:48:31

标签: 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")。

目前,我可以使用以下代码,使用AlamofireImage将UIImageView的图像设置为该网址的图片。

if (self._images[0] != "") {
    myImageView.af_setImage(withURL: URL(string: self._images[0])!)
}

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

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

最简单的整合方法是什么?

我已经尝试了一些诸如for循环之类的东西,但最大的问题是异步,我似乎无法找到解决方案,因为它是异步的我有多个项目。

提前非常感谢你!

2 个答案:

答案 0 :(得分:3)

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

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兑现,在下载之前首先查看现在的兑现图像。

答案 1 :(得分:2)

这是使用thumbnailURL或thumbnailData的更好的解决方案,因为你有一个缓存的图像抛出alamofire,SDWebImage ......

它简单而完美的表现

对于thumbnailURL ,它只接受本地路径:

  1. 获取缓存图片的文件路径
  2. 使用“file://”
  3. 从文件路径前缀创建一个URL对象
      

    “文件://”。表明它的本地路径

        if let path = SDImageCache.shared().defaultCachePath(forKey: item.url_thumbnail), let url = URL(string: "file://\(path)") {
            attributeSet.thumbnailURL = url
        }
    

    对于thumbnailData

    只需指定本地网址

    即可
    attributeSet.thumbnailData = try? Data(contentsOf: url)
    

    调试并了解发生了什么只是

     do {
         attributeSet.thumbnailData = try Data(contentsOf: url)
     }catch (let error as NSError){
          print(error)
     }
    
      

    请注意我使用SDWebImage获取缓存图片的路径,因为我用它来缓存照片