iOS очищает очередь запросов

Когда вы создаете / обновляете / удаляете запись в моем приложении, она создает OutgoingRequest в основных данных. Периодически приложение будет получать эти запросы в очередь и отправлять их все на сервер. Я делаю это, используя сообщение AFHTTPClient (см. Ниже). Проблема, с которой я сталкиваюсь, заключается в том, что она выдвигает все эти запросы за один раз, а затем ответы возвращаются не в реальном порядке.

Мне нужно сделать так, чтобы эти запросы работали "синхронно" в этом запросе B, и его не следует публиковать до тех пор, пока запрос A не будет завершен (успешный или неудачный ответ). Это также делается в фоновом режиме и не должно зависать.

for(OutgoingRequest *req in queue)
{
    NSURL *reqUrl = [NSURL URLWithString: globals.baseURL];
    AFHTTPClient *httpClient = [[AFHTTPClient alloc] initWithBaseURL:reqUrl];
    [httpClient setParameterEncoding:AFJSONParameterEncoding];

    NSDictionary *params = [NSDictionary dictionaryWithObjectsAndKeys:
                            req.url, @"viewName",
                            req.json, @"JSON",
                            req.dateAdded.description, @"dateTime",
                            nil];

    NSString *path = [NSString stringWithFormat:@"cache/update/?deviceUID=%@&token=%@", [MySingleton getMacAddress],  globals.token];

    [httpClient postPath:path parameters:params success:^(AFHTTPRequestOperation *operation, id responseObject) {

            //handle the repsonse

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

    }];
}

Есть ли способ добиться этого с моей текущей настройкой? Или я должен использовать другие средства для размещения на моем сервере?

Спасибо

2 ответа

Решение

Вероятно, лучшая идея здесь заключается в использовании AFHTTPRequestOperation (или один из его подклассов) и создайте зависимости между ними: 2 op. зависит от 1 оп., 3 оп. зависит от 2 оп. и так далее...

Пожалуйста, посмотрите на AFNetworking а также NSOperation документация (AFHTTPRequestOperation это подкласс NSOperation).

Я бы порекомендовал вам посмотреть на внутренний NSOperationQueue что AFHTTPClient управляет. Вы можете установить maxConcurrentOperationCount до 1, чтобы сделать его последовательной очередью, поэтому ваши запросы будут выполняться по одному в том порядке, в котором вы добавляете их в очередь.

Это только для чтения operationQueue собственность на AFHTTPClient.

/**
The operation queue which manages operations enqueued by the HTTP client.
*/
@property (readonly, nonatomic, strong) NSOperationQueue *operationQueue;

Где бы вы ни выполняли настройку клиента, установите счетчик одновременных операций на 1.

myHTTPClient.operationQueue.maxConcurrentOperationCount = 1;

Что касается сетевых запросов, последовательная очередь, вероятно, является хорошей идеей. В конце дня число одновременных запросов по-прежнему ограничено скоростью, которую может иметь количество HTTP-соединений, которые вы можете открыть с вашим сервером, и пропускной способностью антенны устройств, которые имеют верхний предел.

Другие вопросы по тегам