执行选择器不会取消第二次

时间:2015-10-20 06:48:32

标签: ios performselector

在我的应用程序中,我使用执行选择器来表示服务器的更新消息。我在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];
}

但它只是第一次第二次进入此视图时,选择器工作正常,但它不会停止。它的工作背景。所以请帮我解决这个问题。我想知道为什么会出现这个问题。谢谢先进。

2 个答案:

答案 0 :(得分:2)

Apple Documentation

  

讨论取消具有相同目标的所有执行请求   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];
}