2017-05-22 10 views
4

CoreSpotlight를 사용하여 iOS Spotlight에서 콘텐츠를 검색 할 수있는 테스트 응용 프로그램을 만들려고합니다. 현재 사용자가 새로 고침 버튼을 눌러 서버 요청을하면 언제든지 deleteAllSearchableItemsindexSearchableItems (아마도 가장 좋은 방법은 아니지만 가장 쉬운 방법은 지금 당장 나오지 않습니다. 아직 생각해 내기 시작 단계이기 때문에).iOS CoreSpotlight URL의 축소판 그림

아래 코드는 내 코드입니다. 내가 할 노력하고있어

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")이 있습니다.

현재 아래 코드를 사용하여 해당 URL의 이미지에 UIImageView의 이미지를 설정하고 AlamofireImage을 사용할 수 있습니다.

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

어떻게 CoreSpotlight 속성 집합에 동일한 이미지를 가져올 수 있습니까?

나는 attributeSet.thumbnailData.af_setImage(withURL: imagedownloadURL)이 작동하지 않는다고 가정합니다. 특히 비동기식이기 때문에 특히 그렇습니다.

이것을 통합하는 가장 쉬운 방법은 무엇입니까?

루프와 같은 몇 가지를 시도했지만 가장 큰 문제는 비동기이며 비동기 적이기 때문에 해결 방법을 찾을 수없는 것처럼 보입니다. 여러 항목이 있습니다.

미리 감사드립니다.

답변

2

가장 쉬운 해결책하지만 최고의 하나 ...

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") 
      } 
     } 
    }) 
} 

왜 좋은 솔루션을 편집하지? 비동기 문제를 피하기 위해 모든 것을 비동기 클로저에 넣고 동기화 이미지 다운로드를 수행했습니다.

UPDATE

추가 된 기본 Alamofire의 환금, 먼저 지금 현금으로 바꿀 이미지의 모양 다운로드하기 전에. 여기

+0

를 캐시를 사용하고 있기 때문에 그냥 캐시 된 이미지의 경로를 얻을 수 SDWebImage을 사용하고 유의하시기 바랍니다? 코드 예제가 정확히 작동합니까? 왜 이것이 최상의 솔루션이 아닌가? 전반적으로 더 자세하게 설명하면 도움이 될 것입니다. –

+0

몇 가지 세부 정보를 추가했습니다 .. – Bilal

+0

세부 사항이 유용했습니다. 스위프트 측면에서 비동기식 동기화와 관련된 동기화를 계속 시도하고 있습니다. 나는 지금 당신의 대답에 투표 할 것입니다. 나는 현상금을 수여하지 않으며 현상금이 끝날 때까지 답변을 받아 들일 수 없습니다. 그러나 나는 어떤 질문에 현상금을 수여하고 끝난 후에 어떤 대답을 받아 들일 것이다. 대단히 감사합니다. –

0

당신이 있기 때문에 캐시 된 이미지는 alamofire이 SDWebImage이 ...

간단하고 완벽한 성능 현명한

이 thumbnailURL를 들어이 지역에만 동의의 whetever 던져 thumbnailURL 또는 thumbnailData를 사용하여 더 나은 솔루션입니다 경로 :

  1. 가있는 파일 경로 접두어에서 URL 객체를 생성 캐시 된 이미지 파일 경로를 얻을 "파일 : //"

"파일 : //".

단지 디버그 로컬 URL 경로

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

을 할당 받고이 단순히

무슨 일이 일어나고 있는지 알고 그것을 표시하기는 thumbnailData를 들어 로컬 경로를

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

입니다

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

당신이 당신의 대답에 조금 더 디테일을 추가하시기 바랍니다 수 사진