ios - 从 UIActivityViewController 中的 API 获取的自定义消息

标签 ios swift

我希望我的应用程序用户使用 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/

相关文章:

iOS开发应用程序启动崩溃

ios - 在 info.plist (xcode iOS) 的第 0 项中只有一种自定义字体被识别

arrays - Swift - 对具有 bool 值和可选日期的人员数组进行排序

ios - 如何使用 Swift 在 iOS 中添加空白 UITableViewCell?

ios - ScrollView 中的文本字段仅在键盘出现 IOS 后向上移动

ios - 如何在 iOS 应用程序中包含全屏图像

ios - UIScrollView zoom with Autolayout

iOS 音频视频自定义消息

面向 Objective-C 程序员的 C++

ios - 如何强制在 ARC 应用程序下调用 didReceiveMemoryWarning