0

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

[post cancel];

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

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

ответ

1

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

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

Thaks человека, это работа как шарм +1 :) –

+0

Вы долгожданные :) –