0

我正在使用AFNetworking(2.3.1)解析JSON數據並將其顯示在標籤中。離開視圖時停止異步塊請求(AFNetworking; iOS)

爲此,我正在使用在AFHTTPRequestOperation.h中聲明的setCompletionBlockWithSuccess

這樣

三大功能正在呼籲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]; 

} 

雖然這個工程就像一個魅力,因爲它被包含在一個塊請求,這個過程持續整個應用程序的狀態。所以當這個數據不需要顯示時,請求仍然在加載,並且由於這些塊我正在接收內存警告。

我的問題是,一旦離開創建它們的View Controller時,如何停止,取消或暫停這些進程,以便節省內存和數據,或者適當地處理它們?

原諒我,如果這是一個明顯的答案,我只是處理或創建完全錯誤的方式塊。我對AFNetworking和Blocks,操作,異步請求等都是新手。

謝謝。

回答

1

假設你有一個AFHTTPRequestOperation對象調用操作:

[operation cancel]; 

這可能屬於在ViewWillDisappear。

然後你的不良區(然後將其稱之爲)內,您可以檢查,看它是否失敗,因爲一個錯誤,或者如果你取消它:

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

更新 - 如何更具體的例子保存對操作的引用並在視圖消失時將其取消。

@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 )。 我知道這和is和__weak,__block之類的聲明有關。你能在這裏指出我正確的方向嗎? 另外,NSOperations一旦被取消就可以重新啓動了嗎? –

+0

鏈接中的警告很可能是因爲變量bTCAverage是該類的實例變量,並且正在從塊內部訪問它,因此它可以創建保留週期。我用更具體的例子更新了我的答案。 – Brandon

1

事實證明,缺乏停止從一個計時器(即稱爲塊請求,或功能parse)一旦視圖中消失,這不是無效而產生。使-(void)viewDidDisappear:上的定時器無效,修復了問題。

+0

嗨,你能分享計時器無效代碼嗎? – hfz