2

我正在开发一个 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];
        });
    });



}

谢谢

4

3 回答 3

3

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

如果您将计时器安排在辅助线程上,那当然是可能的。

我怀疑这种设计的原因是因为计时器可能被配置为重复(或不重复)——很多人最终会使用“僵尸”线程,因为这些重复计时器永远不会失效。这个问题很容易消耗大量系统资源。

于 2013-08-28T08:21:01.870 回答
0

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

于 2013-08-28T08:07:57.970 回答
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];
    });
});

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

于 2013-08-28T08:27:57.917 回答