2015-10-19 2 views
0

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

Я попытался создать операционную очередь в классе 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”);            
             }]; 

}

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

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; 

}

+0

Попробуйте установить maxConcurrentOperationCount на экземпляр NSOperationQueue на номер больше 1. Если он не установлен, система должна решить, сколько операций он может обрабатывать сразу. – Greg

+0

@ Грег, попытался это сделать. Тем не менее операции происходят один за другим –

+0

Этот парень объяснил NSOperation красивым способом, пройдите через это: https: //izeeshan.wordpress.com/2014/08/17/multi-threading-using-nsoperation/ – manish

ответ

0

Вы не использовали ни одного кода, что вы используете. Пожалуйста, опишите.

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

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

Пожалуйста, добавьте код для, чтобы заставить меня понять ..

спасибо !!!

+1

У меня есть отредактировал мой вопрос. Не могли бы вы подтвердить и предоставить свои комментарии. Я предоставил MaxConcurrentOperationCount до 100. –

+0

В коде я не смог найти 'MaxConcurrentOperationCount' .. – NSPratik

+1

Я объявил вне этого в моем методе init' self.operationQueue = [[NSOperationQueue alloc] init]; self.operationQueue.maxConcurrentOperationCount = 100; ' –