我有一个UIActivityItemProvider子类,它应该通过执行以下操作向UIActivityViewController提供一个NSURL:
理论上似乎相当简单:设置placeholderItem方法以返回虚拟NSURL,然后在item方法中设置处理上传等的所有逻辑。
问题是item方法是一个单一的同步方法,它是在后台线程上调用的,并且应该处理所有的处理并返回一个项(在本例中是一个NSURL).我需要使用的处理上传的方法是异步的(即创建一个以NSURLConnection子类为其委托的UIActivityItemProvider,响应它的委托方法以使用进度指示符更新UI,等等)。但是我不能仅仅在item方法中这样做,因为我不能让item返回,直到它有了它的URL。
我尝试的解决方案是让item方法触发URL连接,然后跳到这个循环中:
while ((self.uploadedFileURL == nil) && (self.uploadErrorMessage == nil)) {
[NSThread sleepForTimeInterval:1.0f];
NSLog(@"Waiting for upload...");
}在didFinishLoading和didFailWithError委托方法中,分别给出了self.uploadedFileURL和self.uploadErrorMessage的值。
但是:这不管用。NSURLConnection从不触发委托方法,我不得不假设它由于某种原因而被阻塞。我得到了一个“等待上传”就像我所期望的那样,每一秒都会出现在日志中,但是其他的事情都没有发生。
我在这里错过了什么?
更新:--我已经找到了一种解决方案,但并不理想:在-item方法中使用同步请求。最大的缺点是我无法显示进度指标,也没有很好地处理网络错误。所以..。还在找更好的方法。
发布于 2014-09-29 12:00:55
好吧,所以我找到了一个很好的解决方案。以下gist提供了NSURLConnection方法的伪同步变体:
https://gist.github.com/SQiShER/5009086
“伪同步”,因为它提供的方法同步地返回它们的值,但是在后端使用异步方法。我确信这并不是一个合法的术语,但这是我所拥有的全部:)
无论如何,链接处的代码响应一些而不是所有的nsurlconnection委托方法.不过,添加更多内容是很简单的。如果有人看到这个,并想要更多的细节,评论,我会花时间来充实这个答案。
发布于 2014-09-26 16:29:49
您可以尝试使用UIActivity的子类。重写-[UIActivity performActivity]并在那里开始下载。一旦你用完了
[self activityDidFinish:YES];才能继续。
https://stackoverflow.com/questions/26062367
复制相似问题