使用委托,操作和队列 [英] Using delegates, operations, and queues
问题描述
我使用的是 AWS SDK 的iOS上传和下载文件,并从当地硬盘驱动器到Amazon S3存储。我有能力做这项工作,但我无法得到S3代表回应时正确操作完成后,或产生错误来提醒我。
I am using the AWS SDK for iOS to upload and download files to and from local hard drive to Amazon S3 storage. I am capable of making this work but I am unable to get the S3 delegate to respond properly to alert me when operations have finished or resulted in an error.
我有我要上传文件的数组。对于每一个文件创建一个的NSOperation
其中主
程序由大量的:
I have an array of files that I want to upload. For each file I create a NSOperation
where the main
routine consist mostly of:
AmazonCredentials * credentials = [[AmazonCredentials alloc] initWithAccessKey:ACCESS_KEY_ID withSecretKey:SECRET_KEY];
putObjectRequest = [[S3PutObjectRequest alloc] initWithKey:pathCopy inBucket:[self bucket]];
putObjectRequest.filename = pathSource;
putObjectRequest.credentials=credentials;
[putObjectRequest setDelegate:s3Delegate];
下面,委托( s3Delegate
)是一个普通的<创建的href="http://docs.amazonwebservices.com/AWSiOSSDK/latest/protocol_amazon_service_request_delegate-p.html"相对=nofollow> AmazonServiceRequestDelegate 的哪些应该能够断火的响应时的动作已完成。每一个我的 NSOperations
添加到我的 NSOperationQueue
其中执行操作不兼任。如果我使用代理 [putObjectRequest setDelegate:s3Delegate]
的操作无法正常工作。如果删除了使用委托的操作都正确执行,但我无法得到任何回复的操作,因为我没有一个代表。
Here, the delegate (s3Delegate
) is created as a regular AmazonServiceRequestDelegate which should be able to fire off responses when an operation has finished. Each of my NSOperations
are added to my NSOperationQueue
which executes operations non-concurrently. If I use the delegate [putObjectRequest setDelegate:s3Delegate]
the operations are not working. If I remove the use of the delegate the operations are performed correctly but I am unable to receive any responses to the operations as I do not have a delegate.
如果我删除了使用 NSOperationQueue
完全并使用 [putObjectRequest setDelegate:s3Delegate]
的代表作品完美。
If I remove the use of the NSOperationQueue
completely and use the [putObjectRequest setDelegate:s3Delegate]
the delegate works perfectly.
我的问题是我在做什么错用为代表的队列?由于委托是完全有能力执行而不是在一个队列会这样涉及到不执行主线程上的?我真的希望能够使用队列来限制非并发操作数,但是我无法想出解决办法。我希望有人有什么是怎么回事的想法,任何例如code会大大AP preciated。谢谢! 欢呼声中,特龙
My question is what am I doing wrong with using a delegate in a queue? Since the delegate is perfectly capable of performing while not in a queue could this be related to not performing on the main thread? I really want to be able to use the queue to limit the number of non-concurrent operations, however I am unable to figure this out. I hope someone has an idea of what is going on here and any example code would be greatly appreciated. Thanks! Cheers, Trond
推荐答案
看来,AWS SDK您设置的委托时间之后的行为是异步的。 因此,为了让您的异步AWS的东西的工作中(异步)的NSOperation,你得把一些魔法等待AWS来完成:
It seems that the aws sdk behaves asynchronously after the time you set your delegate. So in order to have your asynchronous aws stuff work in a (asynchronous) NSOperation, you got to put some magic to wait for AWS to complete:
在您的.H的NSOperation文件,添加一个布尔值:
In your .h NSOperation file, add a boolean:
@interface UploadOperation : NSOperation <AmazonServiceRequestDelegate> {
@private
BOOL _doneUploadingToS3;
}
和你的.m文件,你的主要方法是这样的:
and in your .m file, your main method will look like this:
- (void) main
{
.... do your stuff …..
_doneUploadingToS3 = NO;
S3PutObjectRequest *por = nil;
AmazonS3Client *s3Client = [[AmazonS3Client alloc] initWithAccessKey:ACCESS_KEY withSecretKey:SECRET_KEY];
s3Client.endpoint = endpoint;
@try {
por = [[[S3PutObjectRequest alloc] initWithKey:KEY inBucket:BUCKET] autorelease];
por.delegate = self;
por.contentType = @"image/jpeg";
por.data = _imageData;
[s3Client putObject:por];
}
@catch (AmazonClientException *exception) {
_doneUploadingToS3 = YES;
}
do {
[[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate distantFuture]];
} while (!_doneUploadingToS3);
por.delegate = nil;
.... continue with your stuff ….
}
不要忘记实现你的委托方法
do not forget to implement your delegate methods
-(void)request:(AmazonServiceRequest *)request didCompleteWithResponse:(AmazonServiceResponse *)response
{
_doneUploadingToS3 = YES;
}
-(void)request:(AmazonServiceRequest *)request didFailWithError:(NSError *)error
{
_doneUploadingToS3 = YES;
}
-(void)request:(AmazonServiceRequest *)request didFailWithServiceException:(NSException *)exception
{
_doneUploadingToS3 = YES;
}
- (void) request:(AmazonServiceRequest *)request didSendData:(NSInteger)bytesWritten totalBytesWritten:(NSInteger)totalBytesWritten totalBytesExpectedToWrite:(NSInteger)totalBytesExpectedToWrite
{
// Do what you want
}
-(void)request:(AmazonServiceRequest *)request didReceiveResponse:(NSURLResponse *)response
{
// Do what you want
}
-(void)request:(AmazonServiceRequest *)request didReceiveData:(NSData *)data
{
// Do what you want
}
注意:这个魔术可以为异步执行任何东西,工作,但在一个的NSOperation实施
Note: this magic can work for any stuff that performs asynchronously but have to be implemented in a NSOperation.
这篇关于使用委托,操作和队列的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!