Ios 执行选择器不会第二次取消
在我的应用程序中,我使用执行选择器来更新来自服务器的消息。我在Ios 执行选择器不会第二次取消,ios,performselector,Ios,Performselector,在我的应用程序中,我使用执行选择器来更新来自服务器的消息。我在视图中将调用此方法。 示例UpdateMessages视图中的方法调用将出现,并在web服务响应中设置执行选择器,如下所示 -(void)UpdateChatMessage { /* set some parameters here */ [[UAAPIMaster sharedMaster] getUpdateMessageCall_Completion:params :^(id returnData) {
视图中将调用此方法。
示例UpdateMessages
视图中的方法调用将出现
,并在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
}
}];
}
问题是当我弹出这个视图时,我想停止这个循环。因此,我将代码放入视图将消失
-(void)viewWillDisappear:(BOOL)animated {
[NSObject cancelPreviousPerformRequestsWithTarget:self selector:@selector(UpdateChatMessage) object:nil];
[super viewWillDisappear:animated];
}
但它只工作了第一次第二次我进入这个视图选择器工作得很好,但它没有停止。这是我的工作背景。所以请帮我解决这个问题。我想知道为什么会出现这个问题。感谢高级版。我的猜测是,代码中的完成处理程序是异步执行的,因此它可能是在视图控制器被删除后执行的。您可以通过确保仅在视图仍然可用时调用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];
}
我的猜测是,代码中的完成处理程序是异步执行的,因此它可能是在视图控制器被删除之后执行的。您可以通过确保仅在视图仍然可用时调用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];
}
我的猜测是,代码中的完成处理程序是异步执行的,因此它可能是在视图控制器被删除之后执行的。您可以通过确保仅在视图仍然可用时调用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];
}
我的猜测是,代码中的完成处理程序是异步执行的,因此它可能是在视图控制器被删除之后执行的。您可以通过确保仅在视图仍然可用时调用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];
}
Per:
讨论取消具有相同目标的所有执行请求
作为目标,参数作为参数,选择器作为选择器。这
方法仅删除当前运行循环中的执行请求,而不是全部
运行循环
因此,在创建和取消中,您可能在不同的运行循环上运行
作为旁注,我还希望您通过在object
参数中传递self
而不是nil
进行检查:
[NSObject cancelPreviousPerformRequestsWithTarget:self selector:@selector(UpdateChatMessage) object:self];
Per:
讨论取消具有相同目标的所有执行请求
作为目标,参数作为参数,选择器作为选择器。这
方法仅删除当前运行循环中的执行请求,而不是全部
运行循环
因此,在创建和取消中,您可能在不同的运行循环上运行
作为旁注,我还希望您通过在object
参数中传递self
而不是nil
进行检查:
[NSObject cancelPreviousPerformRequestsWithTarget:self selector:@selector(UpdateChatMessage) object:self];
Per:
讨论取消具有相同目标的所有执行请求
作为目标,参数作为参数,选择器作为选择器。这
方法仅删除当前运行循环中的执行请求,而不是全部
运行循环
因此,在创建和取消中,您可能在不同的运行循环上运行
作为旁注,我还希望您通过在object
参数中传递self
而不是nil
进行检查:
[NSObject cancelPreviousPerformRequestsWithTarget:self selector:@selector(UpdateChatMessage) object:self];
Per:
讨论取消具有相同目标的所有执行请求
作为目标,参数作为参数,选择器作为选择器。这
方法仅删除当前运行循环中的执行请求,而不是全部
运行循环
因此,在创建和取消中,您可能在不同的运行循环上运行
作为旁注,我还希望您通过在object
参数中传递self
而不是nil
进行检查:
[NSObject cancelPreviousPerformRequestsWithTarget:self selector:@selector(UpdateChatMessage) object:self];