AFNetworking отменяет запрос на публикацию

Я знаю, этот вопрос задавать раньше. Но не работает для меня этот сценарий. Я работаю над AFNetworking для уровня передачи. Мой код ниже.

AFHTTPRequestOperation *post; AFHTTPRequestOperationManager *manager;


AFHTTPRequestOperationManager * manager = [AFHTTPRequestOperationManager manager];
    NSMutableDictionary *paramDict = [[NSMutableDictionary alloc] init] ;

    delegate = (id<ConnectionUtilDelegate>) delegateObject;

    for (Parameter *param in parameterArray)
    {
        [paramDict setObject:param.value forKey:param.name];
    }
    NSDictionary *params = paramDict;
    manager.responseSerializer = [AFJSONResponseSerializer serializer];
    manager.responseSerializer.acceptableContentTypes = [NSSet setWithObject:@"text/html"];
    [manager.operationQueue cancelAllOperations];
    post = [manager POST:[NSString stringWithFormat:@"%@",url] parameters:params success:^(AFHTTPRequestOperation *operation, id responseObject) {
        NSLog(@"JSON: %@", responseObject);
        [delegate requestCompleted:responseObject];
    } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
        [delegate requestFailed:error];
        NSLog(@"Error: %@", error);
    }];

это мой почтовый запрос. это работает как шарм. Но иногда какой-то запрос мог запаздывать. Например, я отправляю 2 разных почтовых запроса с этим именем P1 (Post 1) и P2 (Post 2). если этот ответ на запрос возвращается как R1 (ответ 1), а затем R2 (ответ 2), это нормально для меня. Но если этот ответ на запрос возвращается как R2 (ответ 2), а не R1 (ответ 1), это причина для моего приложения. Поэтому я хочу отменить старый запрос при отправке нового запроса. а также

[отменить пост];

Ошибка: [Отмена AFHTTPRequestOperation]: сообщение отправлено в освобожденный экземпляр 0x1723cbf0

не работает для меня. Есть ли у вас предложения?


person Emre Gürses    schedule 22.01.2016    source источник


Ответы (1)


Как я вижу в вашем коде, вы создаете новый AFHTTPRequestOperationManagerinstance для каждого запроса, а затем выполняете cancelAllOperations над OperationQueue вновь созданного AFHTTPRequestOperationManager. Я предлагаю вам создать sharedManager типа AFHTTPRequestOperationManager и использовать этот одноэлементный объект для всех ваших запросов:

+ (instancetype)sharedManager {
    static AFHTTPRequestOperationManager *instance;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        instance = [AFHTTPRequestOperationManager manager];
    });
    return instance;
}

Затем вы можете отменить все запросы перед выполнением нового запроса, используя:

+ (void)cancelAllRequests {
    [[AFHTTPRequestOperationManager sharedManager].operationQueue cancelAllOperations];
}

Когда вы вызываете вышеуказанный метод, все запросы завершатся ошибкой и будет вызван failureblock. Поэтому вам нужно проверить, является ли операция cancelled в блоке отказа. И вот окончательный код:

AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager sharedManager];
NSMutableDictionary *paramDict = [[NSMutableDictionary alloc] init] ;


delegate = (id<ConnectionUtilDelegate>) delegateObject;

for (Parameter *param in parameterArray)
{
    [paramDict setObject:param.value forKey:param.name];
}
NSDictionary *params = paramDict;

manager.responseSerializer = [AFJSONResponseSerializer serializer];
manager.responseSerializer.acceptableContentTypes = [NSSet setWithObject:@"text/html"];

AFHTTPRequestOperation *post = [manager POST:[NSString stringWithFormat:@"%@",url] parameters:params

success:^(AFHTTPRequestOperation *operation, id responseObject) {
        [delegate requestCompleted:responseObject];

}
failure:^(AFHTTPRequestOperation *operation, NSError *error) {
    if (!operation.cancelled) {
        [delegate requestFailed:error];
    }
}];

[post start];
person Murat Adıgüzel    schedule 25.01.2016