2016-02-01 3 views
0

Я новичок в очереди операций, поэтому дайте мне возможность задать вопрос, который может быть задан уже между тем, я много искал, но не смог найти нужное решение.Как реализовать 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]; 

Ищет ответ. Благодаря

+0

Следует отметить, что, хотя вы можете правильно реализовать подход, используя 'NSOperationQueue' - это не метод _optimal_ для решения этой проблемы. Этот подход имеет ряд (небольших) оговорок - но обычно это достаточно, если наши требования умеренные. Если вы хотите выжать лучшее из своего устройства - есть лучшие подходы. – CouchDeveloper

ответ

0

решение должно быть то, что я должен иметь другой API, который принимает массив или строку (разделенные запятой)

Это было бы лучшим решением, да, потому что это минимизирует нагрузку на клиента и сервер и делает наименьшее количество сетевых запросов возможным - это быстро и эффективно.

решение должно быть вызвать этот API в Loop и удалить все, но я слышал другое решение, которое NSOperationQueue

Использование очереди операции лучше, чем работает в цикле, потому что у вас есть контроль над (сколько операций выполняется одновременно), которые вы уже указали в своем коде.

Единственная проблема с вашим кодом - вызывать NSOperationQueue *operationQueue = [[NSOperationQueue alloc] init]; каждый раз перед добавлением новой операции. Вместо этого вы должны создать и настроить очередь операций один раз и сохранить сильную ссылку на нее. В противном случае у вас есть много разных очередей операций, каждый из которых выполняет операции одновременно, а ваш параметр setMaxConcurrentOperationCount:3 ничего не значит.

+0

Нужно ли иметь отдельный класс, который создает объект «AFHTTPRequestOperation», а затем добавить в массив как requestOperationArray, а затем добавить этот массив в NSOperationQueue? Плюс, как мы можем различать или отслеживать каждый запрос? Мне нужно немного помочь в реализации. – Aleem

+0

Да, использование специального класса с этой ответственностью является разумным подходом. отслеживание - это другой вопрос, как вы хотите отслеживать его? – Wain

+0

Thats, где я смущен, что мне нужно отслеживать? – Aleem

Смежные вопросы