首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >UIActivityItemProvider的-item方法:等待NSURLConnection?

UIActivityItemProvider的-item方法:等待NSURLConnection?
EN

Stack Overflow用户
提问于 2014-09-26 14:48:49
回答 2查看 572关注 0票数 4

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

  • 上传图像到我的服务器
  • 从服务器接收URL
  • 向共享者提供该URL。

理论上似乎相当简单:设置placeholderItem方法以返回虚拟NSURL,然后在item方法中设置处理上传等的所有逻辑。

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

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

代码语言:javascript
复制
    while ((self.uploadedFileURL == nil) && (self.uploadErrorMessage == nil)) {
        [NSThread sleepForTimeInterval:1.0f];
        NSLog(@"Waiting for upload...");
    }

didFinishLoadingdidFailWithError委托方法中,分别给出了self.uploadedFileURLself.uploadErrorMessage的值。

但是:这不管用。NSURLConnection从不触发委托方法,我不得不假设它由于某种原因而被阻塞。我得到了一个“等待上传”就像我所期望的那样,每一秒都会出现在日志中,但是其他的事情都没有发生。

我在这里错过了什么?

更新:--我已经找到了一种解决方案,但并不理想:在-item方法中使用同步请求。最大的缺点是我无法显示进度指标,也没有很好地处理网络错误。所以..。还在找更好的方法。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-09-29 12:00:55

好吧,所以我找到了一个很好的解决方案。以下gist提供了NSURLConnection方法的伪同步变体:

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

“伪同步”,因为它提供的方法同步地返回它们的值,但是在后端使用异步方法。我确信这并不是一个合法的术语,但这是我所拥有的全部:)

无论如何,链接处的代码响应一些而不是所有的nsurlconnection委托方法.不过,添加更多内容是很简单的。如果有人看到这个,并想要更多的细节,评论,我会花时间来充实这个答案。

票数 1
EN

Stack Overflow用户

发布于 2014-09-26 16:29:49

您可以尝试使用UIActivity的子类。重写-[UIActivity performActivity]并在那里开始下载。一旦你用完了

代码语言:javascript
复制
[self activityDidFinish:YES];

才能继续。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26062367

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档