iOS 来自 URL 的 CoreSpotlight 缩略图
iOS CoreSpotlight Thumbnail Image from URL
我正在尝试构建一个测试应用程序,该应用程序使用 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?
我假设 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 或缩略图数据,因为您有一个缓存的图像抛出 alamofire、SDWebImage ...
简单而完美的性能
对于缩略图URL它只接受本地路径:
- 获取缓存图片的文件路径
- 从带有 "file://"
的文件路径前缀创建一个 URL 对象
"file://". to indicate it's local path
if let path = SDImageCache.shared().defaultCachePath(forKey: item.url_thumbnail), let url = URL(string: "file://\(path)") {
attributeSet.thumbnailURL = url
}
对于缩略图数据:
只需分配本地url路径
attributeSet.thumbnailData = try? Data(contentsOf: url)
调试并了解正在发生的事情只是
do {
attributeSet.thumbnailData = try Data(contentsOf: url)
}catch (let error as NSError){
print(error)
}
just please note I am using SDWebImage to get the cached image's path, since I am using it to cache the photos
我正在尝试构建一个测试应用程序,该应用程序使用 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?
我假设 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 或缩略图数据,因为您有一个缓存的图像抛出 alamofire、SDWebImage ...
简单而完美的性能
对于缩略图URL它只接受本地路径:
- 获取缓存图片的文件路径
- 从带有 "file://" 的文件路径前缀创建一个 URL 对象
"file://". to indicate it's local path
if let path = SDImageCache.shared().defaultCachePath(forKey: item.url_thumbnail), let url = URL(string: "file://\(path)") {
attributeSet.thumbnailURL = url
}
对于缩略图数据:
只需分配本地url路径
attributeSet.thumbnailData = try? Data(contentsOf: url)
调试并了解正在发生的事情只是
do {
attributeSet.thumbnailData = try Data(contentsOf: url)
}catch (let error as NSError){
print(error)
}
just please note I am using SDWebImage to get the cached image's path, since I am using it to cache the photos