2015-10-17 5 views
1

Я хочу, чтобы пользователи моего приложения делились ссылкой с помощью UIACtivityViewController. Ссылка не является статической, и я должен ее извлечь из api. Я хочу получить эту ссылку, как только кто-то нажмет значок в UIActivityViewController, но как я это делаю сейчас, не работает. Обработчик завершения запроса всегда вызывается в конце метода fetchShareURL(). Может ли кто-нибудь сказать мне, как это исправить?Пользовательское сообщение, полученное из API в UIActivityViewController

import UIKit 

    class ShareItemSource: NSObject, UIActivityItemSource { 


     var objects : [AnyObject]? 
     var shareURL : String? 

     init(objects : [AnyObject]?){ 
      self.objects = objects 
     } 

     func fetchShareURL() -> Bool{ 
      //fetch share url from api 

      let api = Api() 
      let semaphore = dispatch_semaphore_create(0); 
      let backgroundQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0) 
      dispatch_async(backgroundQueue, { 

       api.export(self.groupObjList, receiptObjList: self.receiptObjList){ status, message, url in 
        dispatch_async(dispatch_get_main_queue(), { 
         self.shareURL = url 

         dispatch_semaphore_signal(semaphore); 
        }) 
       } 

      }); 

      let delayInSeconds = 30.0; 
      let delayTime = dispatch_time(DISPATCH_TIME_NOW, Int64(delayInSeconds * Double(NSEC_PER_SEC))) 
      dispatch_semaphore_wait(semaphore, delayTime) 

      if self.shareURL != nil{ 
       return true 
      } else { 
       return false 
      } 

     } 


     @objc func activityViewControllerPlaceholderItem(activityViewController: UIActivityViewController) -> AnyObject { 
      return "" 
     } 

     @objc func activityViewController(activityViewController: UIActivityViewController, itemForActivityType activityType: String) -> AnyObject? { 
      if fetchShareURL() == true{ 
       return "Download files: "+self.shareURL! 

      } else { 
       return nil 
      } 

     } 

     func activityViewController(activityViewController: UIActivityViewController, subjectForActivityType activityType: String?) -> String { 
      return "title of share" 
     } 

     func activityViewController(activityViewController: UIActivityViewController, thumbnailImageForActivityType activityType: String?, suggestedSize size: CGSize) -> UIImage? { 
      //do stuff 
    } 
} 

ответ

0

Если данные должны быть предоставлены в UIActivityView требуется время, чтобы обеспечить, используйте UIActivityItemProvider. Это подкласс NSOperation и полностью решает всю проблему целиком. В самом деле, такая ситуация - именно то, для чего она предназначена. (И посмотрите видео WWDC 2015 на продвинутом NSOperation, пожалуйста.)

+0

И никогда никогда не используйте семафоры, подобные этому. Если что-то асинхронно, пусть оно будет асинхронным. – matt

+0

Я должен признать, что если бы это был я, и это никогда не будет, потому что то, что вы пытаетесь сделать, действительно рискованно - тогда, когда пользователь нажимает кнопку совместного доступа, чтобы вызвать вид активности, я бы предоставил некоторые а затем попытайтесь выполнить загрузку, чтобы я даже не показывал представление, если есть проблемы с достижимостью или таймаутом. Таким образом, если я показываю вид активности, у меня есть данные. Я все равно буду использовать NSOperations, но по-другому. – matt

0

На данный момент это было изменено. Позже я буду использовать NSOperation.

api.export(self.objects){ status, message, url in 
     if(status == true){ 
      if let url = url{ 
       alert.dismissViewControllerAnimated(true){ 
        let sharingItems = ["Share url", url] 
        let activityViewController = UIActivityViewController(activityItems: [ShareItemSource(url: url)], applicationActivities: nil) 
        activityViewController.excludedActivityTypes = [UIActivityTypeAddToReadingList, UIActivityTypeCopyToPasteboard] 
        self.presentViewController(activityViewController, animated: true, completion: nil) 
        activityViewController.completionWithItemsHandler = { (activity, success, items, error) in 
         //Response 
        } 

       } 
      } 
     } else { 
      //handle fail 
     } 
    } 
Смежные вопросы