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];