0

Я использую AFNetworking (2.3.1) для анализа данных JSON и отображения их в меток.Остановка асинхронного запроса блока при выходе из системы (AFNetworking; iOS)

Для этого я использую setCompletionBlockWithSuccess, который указан в AFHTTPRequestOperation.h.

Три функции, как это в настоящее время называется на viewDidLoad, один выглядит следующим образом:

-(void)parse { 

    NSURL *url = [[NSURL alloc] initWithString:kURL]; 
    NSURLRequest *request = [[NSURLRequest alloc] initWithURL:url]; 

    AFHTTPRequestOperation *operation = [[AFHTTPRequestOperation alloc] initWithRequest:request]; 
    operation.responseSerializer = [AFJSONResponseSerializer serializer]; 

    [operation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) { 

     NSLog(@"Parse Successful"); 
     //Code for JSON Parameters and to display data 


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

     NSLog(@"%@", [error localizedDescription]); 
     //Code for Failure Handling 

    }]; 

    [operation start]; 

} 

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

Мой вопрос в том, как я могу остановить, отменить или приостановить эти процессы после того, как я покинул контроллер просмотра, чтобы они были созданы, чтобы сохранить память и данные или правильно их обработать?

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

Спасибо.

ответ

1

Если у вас есть объект AFHTTPRequestOperation под названием операции:

[operation cancel]; 

Это, вероятно, принадлежит в ViewWillDisappear.

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

if ([operation isCancelled]) 
{ 
    //I canceled it. 
} 

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

@interface myViewController() 

@property (strong, nonatomic) AFHTTPRequestOperation *parseOperation; 

@end 

@implementation myViewController 

- (void)viewWillDisappear:(BOOL)animated 
{ 
    [super viewWillDisappear:animated]; 

//no need to check to see if the operation is nil (because it never happened or it's complete) because 
//messages sent to nil are ok. 
[self.parseOperation cancel]; 
} 

-(void)parse { 

NSURL *url = [[NSURL alloc] initWithString:kURL]; 
NSURLRequest *request = [[NSURLRequest alloc] initWithURL:url]; 

//save the parse operation so we can cancel it later on if we need to 
self.parseOperation = [[AFHTTPRequestOperation alloc] initWithRequest:request]; 
self.parseOperation.responseSerializer = [AFJSONResponseSerializer serializer]; 

__weak myViewController *weakSelf = self; 
[self.parseOperation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) { 
    //nil out the operation we saved earlier because now that it's finished we don't need to cancel it anymore 
    weakSelf.parseOperation = nil; 

    NSLog(@"Parse Successful"); 
    //Code for JSON Parameters and to display data 


} failure:^(AFHTTPRequestOperation *operation, NSError *error) { 
    if (!operation.isCancelled) { 
    NSLog(@"%@", [error localizedDescription]); 
    //Code for Failure Handling 
    } 
}]; 

[self.parseOperation start]; 
} 
+0

Я проверил отмену операции раньше, но есть проблема. Как только я объявляю операцию за пределами инструкции void (так, чтобы ее можно было отменить), я получаю предупреждение, которое вы можете увидеть здесь (http://i.imgur.com/yGDhrfX.png). Я понимаю, что это связано с объявлениями вроде __weak, __block и т. Д. Можете ли вы указать мне в правильном направлении здесь? Кроме того, NSOperations можно запустить снова, как только они будут отменены, не так ли? –

+0

Предупреждение в ссылке, вероятно, связано с тем, что переменная bTCAverage является переменной экземпляра класса и к ней обращаются изнутри блока, что позволяет создать цикл сохранения. Я уточнил свой ответ с более конкретным примером. – Brandon

1

Как оказалось, отсутствие остановки был вытекающих из таймера (что называется запрос блока, или функцию parse), которая не была признана недействительной, как только вид исчезает. Исправлена ​​проблема с установкой таймера на -(void)viewDidDisappear:.

+0

Привет, можете ли вы делить недействительный код таймера? – hfz

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