2015-10-20 85 views
0

在我的應用程序中,我正在使用執行選擇器來更新消息表單服務器。我在viewWillAppear中稱這種方法。
示例UpdateMessages方法調用viewWillAppear並設置在這樣的Web服務響應中執行選擇器。執行選擇器不會第二次取消

-(void)UpdateChatMessage { 
/* set some parameters here */ 
     [[UAAPIMaster sharedMaster] getUpdateMessageCall_Completion:params :^(id returnData) { 
       [self performSelector:@selector(UpdateChatMessage) withObject:nil afterDelay:1.2]; // Call this method again using performSelector 
      } 
     }]; 
    } 

問題是當我彈出這個視圖我想停止這個循環。所以我把代碼放在viewWillDisappear

-(void)viewWillDisappear:(BOOL)animated { 
    [NSObject cancelPreviousPerformRequestsWithTarget:self selector:@selector(UpdateChatMessage) object:nil]; 
    [super viewWillDisappear:animated]; 
} 

但它只能工作第一次我第二次進入該視圖選擇完美的工作,但它不會停止。它工作背景。所以請幫我解決這個問題。我想知道爲什麼會出現這個問題。先謝謝了。

回答

1

我的猜測是代碼中的完成處理程序是異步執行的,因此可能會在視圖控制器已被刪除後執行它。你可以儘量避免通過確保performSelector只調用如果視圖仍然可用:

@property BOOL shouldPerformUpdateChat; 

-(void)UpdateChatMessage { 
/* set some parameters here */ 
    [[UAAPIMaster sharedMaster] getUpdateMessageCall_Completion:params :^(id returnData) { 
     dispatch_async(dispatch_get_main_queue(), ^{ 
      if (self.shouldPerformUpdateChat) { 
       [self performSelector:@selector(UpdateChatMessage) withObject:nil afterDelay:1.2]; // Call this method again using performSelector 
      } 
     }); 
    }]; 
} 

-(void)viewWillAppear:(BOOL)animated { 
    [super viewWillAppear:animated]; 
    self.shouldPerformUpdateChat = YES; 
    [self UpdateChatMessage]; 
} 

-(void)viewWillDisappear:(BOOL)animated { 
    self.shouldPerformUpdateChat = NO; 
    [NSObject cancelPreviousPerformRequestsWithTarget:self selector:@selector(UpdateChatMessage) object:nil]; 
    [super viewWillDisappear:animated]; 
} 
2

Apple Documentation

討論所有執行的請求被取消具有相同的目標 爲aTarget ,參數作爲參數,選擇器作爲選擇器。這個 方法僅在當前運行循環中刪除執行請求,並非全部運行循環爲 。

因此,您可能在創建和取消時運行在不同的運行循環中。

作爲一個方面說明,我也希望你在object參數傳遞self,而不是nil檢查:

[NSObject cancelPreviousPerformRequestsWithTarget:self selector:@selector(UpdateChatMessage) object:self]; 
相關問題