我希望我的应用程序用户使用 UIACtivityViewController 共享链接。该链接不是静态的,我必须从 api 中获取它。我想在有人按下 UIActivityViewController 中的图标时立即获取此链接,但我现在的操作方式不起作用。请求的完成处理程序总是在方法 fetchShareURL() 结束时执行。有人可以告诉我如何解决这个问题吗?
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
}
}
最佳答案
如果要在 UIActivityView 中提供的数据需要时间来提供,请使用 UIActivityItemProvider .它是 NSOperation 的子类,以完全连贯的方式解决了整个问题。事实上,这种情况正是它的目的。 (请观看有关高级 NSOperation 的 WWDC 2015 视频。)
关于ios - 从 UIActivityViewController 中的 API 获取的自定义消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33187829/