self performSelector:withObject:afterDelay:不调用方法

时间:2013-08-28 07:44:55

标签: iphone ios

我正在开发一个iPhone应用程序,我试图在一定延迟后调用特定方法。但是方法没有被调用。我不知道为什么它没有被调用。

这是我的代码

-(void)gettingCommentsList { //    some stuff....

    [self performSelector:@selector(callGetListInBackgroundMethod) withObject:nil afterDelay:1.0]; }

-(void)callGetListInBackgroundMethod {
    isFromthread =YES;


     NSLog(@"callGetListInBackground");
    dispatch_async( dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        // Add code here to do background processing
        //
        //

        [self gettingCommentsList];
        dispatch_async( dispatch_get_main_queue(), ^{
            // Add code here to update the UI/send notifications based on the
            // results of the background processing

            [self.commentsTbl reloadData];
        });
    });



}

由于

3 个答案:

答案 0 :(得分:2)

一个潜在的问题是定时器在定时器被触发之前不会阻止线程退出。因此,如果运行循环(调用-performSelector:withObject:afterDelay:的线程)没有其他源(工作),它可能不会继续运行一秒钟或更长时间,并且线程将在计时器触发之前退出(并且您的自定义工作是执行)。

如果你在辅助线程上安排计时器,那肯定是可能的

我怀疑这种设计的原因是因为定时器可能被配置为经常性(或不经常) - 很多人最终会遇到“僵尸”线程,因为那些经常性的定时器永远不会失效。这个问题很容易扼杀大量的系统资源。

答案 1 :(得分:0)

确保你没有调用[NSObject cancelPreviousPerformRequestsWithTarget:self]

答案 2 :(得分:0)

你似乎是从另一个方法调用每个方法 -

在gettingCommentList中,您可以调用

[self performSelector:@selector(callGetListInBackgroundMethod) withObject:nil afterDelay:1.0];

并在dispatch_async的callGetListInBackgroundMethod中调用

[self gettingCommentList];

编辑:

尝试只打一次电话,看它是否有效。如果是这样,可能是在第二个呼叫开始之前你没有完成第一个呼叫,因此问题就出现了。让我知道会发生什么。

编辑2:

我尝试了你的代码。问题是后续调用gettingCommentList是在后台线程而不是主线程。所以我这样做了:

dispatch_async( dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
    // Add code here to do background processing
    //        
    dispatch_async( dispatch_get_main_queue(), ^{
      [self gettingCommentsList];
    });
});

它有效。但是请确保你不要连续调用这两个函数,因为这会使它们一直运行,我相信你并不是真的想要: - )