在我的应用程序中,我使用执行选择器来表示服务器的更新消息。我在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];
}
但它只是第一次第二次进入此视图时,选择器工作正常,但它不会停止。它的工作背景。所以请帮我解决这个问题。我想知道为什么会出现这个问题。谢谢先进。
答案 0 :(得分:2)
讨论取消具有相同目标的所有执行请求 as aTarget,参数为anArgument,selector为aSelector。这个 方法仅在当前运行循环中删除执行请求,而不是全部 运行循环。
因此,您可能在创建和取消中运行不同的运行循环。
作为旁注,我还希望您通过在self
参数中传递nil
而不是object
进行检查:
[NSObject cancelPreviousPerformRequestsWithTarget:self selector:@selector(UpdateChatMessage) object:self];
答案 1 :(得分: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];
}