在dispatch_queues中委托回调

时间:2014-04-18 00:06:48

标签: objective-c multithreading grand-central-dispatch

根据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];
});

请注意,我保留了队列,因此在块返回后,队列会一直存在。但是,这仍然无法工作 - 委托回调永远不会被调用。为什么会这样?

1 个答案:

答案 0 :(得分:0)

你已经创建了一个Serial Dispatch Queue,但它并不意味着应该有一个附加到队列的线程,系统管理器是后台线程,它会为某个队列提供一个线程来执行你的代码推进队列。

Serial Dispatch Queue保证您推送的工作是逐个执行的,但它并不保证执行工作的线程是相同的。

因此,在使用全局并发调度队列时遇到同样的问题。