根据AWS SDK documentation,以下 不 工作:
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_async(queue, ^{
S3PutObjectRequest *request = [[S3PutObjectRequest alloc] initWithKey:objectKey inBucket:bucketName];
request.data = data;
request.delegate = self;
[s3Client putObject:request];
});
意思是,由于以下原因,不会调用委托方法:
此GCD队列中的块将在后台线程中执行, 它有自己的运行循环,与主线程上的运行循环分开。 委托将在后台线程的运行循环中注册 负责调用AmazonServiceRequestDelegate 方法。但是,putObject:立即返回整个块 也回来了。当块完成其执行时,后台 线程将由GCD收集,并且没有任何责任 调用委托方法将被遗忘。这就是上面的原因 代码示例不起作用。
而且确实如此,委托方法永远不会被代码块调用。但是,我希望这可行:
self.queue = dispatch_queue_create("MyQueue", NULL);
dispatch_async(self.queue, ^{
S3PutObjectRequest *request = [[S3PutObjectRequest alloc] initWithKey:objectKey inBucket:bucketName];
request.data = data;
request.delegate = self;
[s3Client putObject:request];
});
请注意,我保留了队列,因此在块返回后,队列会一直存在。但是,这仍然无法工作 - 委托回调永远不会被调用。为什么会这样?
答案 0 :(得分:0)
你已经创建了一个Serial Dispatch Queue,但它并不意味着应该有一个附加到队列的线程,系统管理器是后台线程,它会为某个队列提供一个线程来执行你的代码推进队列。
Serial Dispatch Queue保证您推送的工作是逐个执行的,但它并不保证执行工作的线程是相同的。
因此,在使用全局并发调度队列时遇到同样的问题。