gpt4 book ai didi

ios - UIActivityItemProvider 的 -item 方法 : waiting for an NSURLConnection?

转载 作者:可可西里 更新时间:2023-11-01 06:07:03 26 4
gpt4 key购买 nike

我有一个 UIActivityItemProvider 子类,它应该通过执行以下操作为 UIActivityViewController 提供一个 NSURL:

  • 上传一张图片到我的服务器
  • 从服务器接收一个 URL
  • 将该 URL 提供给共享者。

理论上看起来相当简单:设置 placeholderItem 方法返回一个虚拟 NSURL,然后设置所有逻辑来处理 item 中的上传等> 方法。

问题是 item 方法是在后台线程上调用的单个同步方法,应该处理所有处理并返回一个项目(在本例中,一个 NSURL)... 而我需要用来处理上传的方法是异步的(即,我创建了一个 NSURLConnection 并将 UIActivityItemProvider 子类作为其委托(delegate),响应它的委托(delegate)方法以使用进度指示器更新我的 UI,等等......但我不能只在 item 方法中这样做,因为我不能让 item 返回直到它有它的 URL。

我尝试的解决方案是让 item 方法触发 URL 连接,然后跳入此循环:

    while ((self.uploadedFileURL == nil) && (self.uploadErrorMessage == nil)) {
[NSThread sleepForTimeInterval:1.0f];
NSLog(@"Waiting for upload...");
}

然后我依靠各种 NSURLConnection 委托(delegate)方法来更新进度等。在 didFinishLoadingdidFailWithError 委托(delegate)方法中,我给出值分别为 self.uploadedFileURLself.uploadErrorMessage

但是:这是行不通的。 NSURLConnection 从不触发委托(delegate)方法,我不得不假设它由于某种原因被阻止了。正如我所期望的那样,我每秒都会在日志中收到“正在等待上传...”,但没有其他任何事情发生。

我在这里错过了什么?

更新:我找到了某种解决方案,但不太理想:在 -item 方法中使用同步请求。最大的缺点是我无法显示进度指示器,并且无法很好地处理网络错误。所以...仍在寻找更好的方法。

最佳答案

好的,所以我发现了一个很好的解决方案。以下要点提供了 NSURLConnection 方法的伪同步变体:

https://gist.github.com/SQiShER/5009086

“伪同步”在于它提供的方法同步返回它们的值,但在后端使用异步方法。我敢肯定这不是一个真正合法的术语,但这就是我所拥有的:)

无论如何,链接中的代码响应了一些但不是所有的 nsurlconnection 委托(delegate)方法……不过添加更多是微不足道的。如果有人看到这个并想要了解更多详细信息,请发表评论,我会花时间充实这个答案。

关于ios - UIActivityItemProvider 的 -item 方法 : waiting for an NSURLConnection?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26062367/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com