如何以正确的方式实施NSOperationQueue

时间:2016-02-01 10:16:45

标签: ios objective-c nsoperationqueue

我是操作队列中的新手,所以请我灵活地提出可能已经问过的问题,同时我搜索了很多但是找不到我想要的解决方案。

我有一个API,它通过使用AFNetworking(将documentID作为param和accesstoken)删除单个文档及其工作正常。现在我想删除多个文档,解决方案应该是我应该有另一个采用数组或字符串的API(以逗号分隔)。

据我所知,解决方案应该是将该API调用为Loop并删除所有,但我听到另一个解决方案是NSOperationQueue。我看到了教程,但我无法以正确的方式使用它们。 下面是我调用一个操作的代码。

    NSString *jsonString = @"";
NSString *authorizationValue = [self setAuthorizationValue:action];
NSString *language = @"en_US";

NSMutableURLRequest *request = [[NSMutableURLRequest alloc] init];

[request setValue:@"application/json" forHTTPHeaderField:@"Content-Type"];
[request setValue:@"application/json" forHTTPHeaderField:@"Accept"];
[request setValue:language forHTTPHeaderField:@"Accept-Language"];
[request setValue:authorizationValue forHTTPHeaderField:@"authorization"];

//convert parameters in to json data

if ([params isKindOfClass:[NSDictionary class]]) {
    NSError *error;
    NSData *jsonData = [NSJSONSerialization dataWithJSONObject:params
                                                       options:NSJSONWritingPrettyPrinted
                                                         error:&error];
    jsonString = [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding];
}

[request setURL:[NSURL URLWithString:action]];
[request setTimeoutInterval:500.0];
[request setHTTPMethod:@"DELETE"];
NSMutableData *postBody = [NSMutableData data];
[postBody appendData:[jsonString dataUsingEncoding:NSUTF8StringEncoding]];
[request setHTTPBody:postBody];

AFHTTPRequestOperation *operation = [[AFHTTPRequestOperation alloc]initWithRequest:request];

operation.responseSerializer = [AFJSONResponseSerializer serializer];

所以请指导我如何在操作队列中调用它,我是否需要创建这些调用并放入数组然后将它们添加到操作队列中。

NSOperationQueue *operationQueue = [[NSOperationQueue alloc] init];
// Set the max number of concurrent operations (threads)
[operationQueue setMaxConcurrentOperationCount:3];
[operationQueue addOperations:@[operation] waitUntilFinished:NO];

寻找您的回复。 感谢

1 个答案:

答案 0 :(得分:0)

  

解决方案应该是我应该有另一个API,它采用数组或字符串(以逗号分隔)

这将是最好的解决方案,是的,因为它可以最大限度地减少客户端和服务器的工作量,并使尽可能少的网络请求成为可能 - 它快速而有效。

  

解决方案应该是将该API调用为Loop并删除所有,但我听到另一个解决方案是NSOperationQueue

使用操作队列比在循环中运行更好,因为您可以控制已经在代码中显示的时间(并发运行的操作数)。

您的代码唯一的问题是每次在添加新操作之前调用NSOperationQueue *operationQueue = [[NSOperationQueue alloc] init];。您应该创建并配置一次操作队列,并存储对它的强引用,而不是这样做。否则,您有许多不同的操作队列,每个操作队列同时执行操作,而setMaxConcurrentOperationCount:3的设置则没有任何意义。