Я хочу, чтобы пользователи моего приложения делились ссылкой с помощью 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
}
}
И никогда никогда не используйте семафоры, подобные этому. Если что-то асинхронно, пусть оно будет асинхронным. – matt
Я должен признать, что если бы это был я, и это никогда не будет, потому что то, что вы пытаетесь сделать, действительно рискованно - тогда, когда пользователь нажимает кнопку совместного доступа, чтобы вызвать вид активности, я бы предоставил некоторые а затем попытайтесь выполнить загрузку, чтобы я даже не показывал представление, если есть проблемы с достижимостью или таймаутом. Таким образом, если я показываю вид активности, у меня есть данные. Я все равно буду использовать NSOperations, но по-другому. – matt