Выполнение нескольких NSOperations параллельно

У меня есть несколько методов в разных классах моего проекта, например, methodA(), methodB(), methodC()... methodZ(). Каждый метод выполняет сетевой вызов, используя NSOperation. Бывают случаи, когда мне приходится выполнять методы параллельно, например, методы A, D, M должны выполняться параллельно. Скажем, в другом случае методы D, S, T должны выполняться параллельно. Я поддерживаю общий метод в классе APIManager, который выполняет все мои методы.

Я попытался создать очередь операций в классе APIManager, но она не работает. Только после выполнения одного метода происходит выполнение другого метода. Кто-нибудь может подсказать по этому поводу?

-(void) methodA {

NSString *path = [NSString stringWithFormat:kPath, @“Function1”];

NSString *requestXML = [NSString stringWithFormat:kGetFunction1RequestXML];

self.operation = [self.apiMgr requestWithPath:path method:@"POST" xml:requestXML headers:@{@"Accept": @"application/xml", @"Content-Type": @"application/xml"}

                                      success:^(id response) {

                                          NSLog(@“Request successful. Do further handling”);                                              
                                      }

                                      failure:^(NSError *error) {
                                          NSLog(@“failed”);                                              
                                      }];

}

-(недействительный) методB {

NSString *path = [NSString stringWithFormat:kPath, @“Function2”];

NSString *requestXML = [NSString stringWithFormat:kGetFunction2RequestXML];

self.operation = [self.apiMgr requestWithPath:path method:@"POST" xml:requestXML headers:@{@"Accept": @"application/xml", @"Content-Type": @"application/xml"}

                                      success:^(id response) {

                                          NSLog(@“Request successful. Do further handling”);                                              
                                      }

                                      failure:^(NSError *error) {
                                          NSLog(@“failed”);                                              
                                      }];

}

- (id)requestWithPath:(NSString *)path method:(NSString *)method xml:(NSString *)requestXML headers:(NSDictionary *)headers success:(void(^)(id response))success failure:(void(^)(NSError *error))failure

{

NSURL *url = [NSURL URLWithString:[NSString stringWithFormat:@“%@, self.serverAddress]];

AFHTTPClient *client = [AFHTTPClient clientWithBaseURL:url];

if (headers) {
    for (NSString *header in headers) {
        [client setDefaultHeader:header value:headers[header]];
    }
}

[client setParameterEncoding:AFJSONParameterEncoding];

NSMutableURLRequest *request = nil;

request = [client requestWithMethod:method path:path parameters:nil];

[request setHTTPBody:[requestXML dataUsingEncoding:NSUTF8StringEncoding]];

AFHTTPRequestOperation *operation = [[AFHTTPRequestOperation alloc] initWithRequest:request];
[self.operationQueue addOperation:operation];

[operation setAuthenticationAgainstProtectionSpaceBlock:^BOOL(NSURLConnection *connection, NSURLProtectionSpace *protectionSpace)
 {
     return YES;
 }];

[operation setAuthenticationChallengeBlock:^(NSURLConnection *connection, NSURLAuthenticationChallenge *challenge)
 {
     [challenge.sender useCredential:[NSURLCredential credentialForTrust:challenge.protectionSpace.serverTrust] forAuthenticationChallenge:challenge];
     [challenge.sender continueWithoutCredentialForAuthenticationChallenge:challenge];
 }];

[operation setShouldExecuteAsBackgroundTaskWithExpirationHandler:^{
    LogVerbose(@"Background time expired for AFNetworking...");
}];


[operation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) {

    NSString *xmlStr = [[NSString alloc] initWithData:responseObject encoding:NSUTF8StringEncoding];
    NSDictionary *xmlDic = [NSDictionary dictionaryWithXMLString:xmlStr];

    if (success)
        success(xmlDic);

} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
    if (failure) {

         failure(error);
    }
}];

return nil;

}


person Suneel G    schedule 19.10.2015    source источник
comment
Попробуйте настроить maxConcurrentOperationCount для экземпляра NSOperationQueue на число больше 1. Если это не установлено, система должна решить, сколько операций она может обрабатывать одновременно.   -  person Greg    schedule 19.10.2015
comment
@ Грег, тоже пробовал. Тем не менее операции происходят одна за другой   -  person Suneel G    schedule 19.10.2015
comment
Этот парень хорошо объяснил NSOperation, пожалуйста, прочтите это: izeeshan.wordpress.com/2014/08/17/   -  person manish    schedule 19.10.2015


Ответы (1)


Вы не поделились кодом, который вы реализуете.

NSOperationsQueue принимает только NSOperation, и вам нужно будет указать свойство MaxConcurrentOperationCount, чтобы сообщить очереди, сколько операций вы хотите выполнять параллельно.

В вашем случае вы определили методы: methodA(), methodB(), methodC()... methodZ(). Каждый метод выполняет сетевой вызов, используя NSOperation. Но что вы добавляете в NSOperationsQueue, чего не упомянули.

person NSPratik    schedule 19.10.2015
comment
Я отредактировал свой вопрос. Не могли бы вы проверить и предоставить свои комментарии. Я предоставил MaxConcurrentOperationCount значение 100. - person Suneel G; 20.10.2015
comment
Я объявил вне этого в моем методе инициализации self.operationQueue = [[NSOperationQueue alloc]init]; self.operationQueue.maxConcurrentOperationCount = 100; - person Suneel G; 20.10.2015