ios - AmazonS3Client putObject 仅适用于 iOS 主线程?

标签 ios multithreading amazon-s3

我正在尝试使用 AmazonS3Client 来 putObject。奇怪的是,它似乎只在我在 iOS 主线程上运行我的 putObject 代码时才起作用。

代码基本上是这样的:

-(void)uploadVideoToS3
{
    S3PutObjectRequest * videoPOR = [[S3PutObjectRequest alloc] initWithKey:video.onlineVideoID inBucket:video.onlineVideoBucketName];
    videoPOR.contentType = @"video/quicktime";
    videoPOR.data        = [NSData dataWithContentsOfURL:video.convertedVideoLocalURL];
    videoPOR.delegate    = self;

    // Put the thumbnail and video into the specified s3 
    AmazonS3Client * s3 = [AmazonClientManager s3];

    [s3 putObject:videoPOR];
    [videoPOR  release];
}

存储桶存在,我有权限等,如果我简单调用

[self uploadVideoToS3]

在我的代码中(在主线程之外),整个视频上传方法运行(我有一些 NSLogs 来证明这一点),但我从来没有得到任何状态回调,没有抛出异常,也没有放置对象放入 S3 上的存储桶中。

当我像这样在主线程上调用上传函数时:

dispatch_async(dispatch_get_main_queue(), ^(void) {
                    [self uploadVideoToS3];
                });

我收到进度回调,一切正常,对象已成功放入 S3 存储桶。

有谁知道 putObject 是否只能在 iOS 主线程上运行?如果是这样,那将是不幸的,因为它通常是 UI 线程。

谢谢, 凯文

附言我尝试在非主线程上分派(dispatch)函数调用,但结果相同。

最佳答案

我认为您的线程在完成发送请求后终止,因此回调没有线程可去。创建线程并不自动意味着它永远存在。一旦完成任务,它就会结束并为线程池回收。要在另一个线程上执行此操作,您将必须设计一种与运行循环集成的方法。在 Threading Programming Guide 中有一节关于它在 Apple 文档中。

关于ios - AmazonS3Client putObject 仅适用于 iOS 主线程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10875242/

相关文章:

iOS block 和对自身的强/弱引用

ios - writetofile 总是返回 false

c - 返回一个 void 指针作为线程返回

c++ - std::this_thread::yield() 与 std::this_thread::sleep_for()

amazon-web-services - Amazon S3存储桶策略,仅允许一个域访问文件

ios - 静态渐变图像与 CAGradientLayer?

iphone - iOS:检测WIFI是否通过认证?

c# - .Net:后台 worker 和多 CPU

heroku - 将舒适的墨西哥沙发 cms 图像从 s3 存储桶上传到 heroku

node.js - 具有 Rekognition 的 AWS Lambda 函数始终返回 null node.js