performSelector:withObject:afterDelay: not making call

前端 未结 4 1981
情书的邮戳
情书的邮戳 2021-02-19 00:45

in a method, i want to call a method after n seconds:

    self.toolBarState = [NSNumber numberWithInt:1];
    [self changeButtonNames];
    [self drawMap];
    [         


        
相关标签:
4条回答
  • 2021-02-19 01:14

    Try using:

    -(void) select {   
        [self changeButtonNames];
        [self drawMap];
        [self performSelectorOnMainThread:@selector(showActionSheet) withObject:nil waitUntilDone:YES];
    }
    

    -performSelector:withObject:afterDelay: schedules a timer on the same thread to call the selector after the passed delay.

    Maybe this will work for you:

    -(void) select {   
        [self changeButtonNames];
        [self drawMap];
        [self performSelectorOnMainThread:@selector(someA) withObject:nil waitUntilDone:YES];
    }
    
    -(void)someA {
        [self performSelector:@selector(showActionSheet) withObject:nil afterDelay:2];
    }
    
    0 讨论(0)
  • 2021-02-19 01:14

    I ran into this same issue, and by necessity I solve it slightly different from the accepted answer. Notice I wanted my delay and selectors to be variables? Using a block allows me to stay within my current method.

    dispatch_async(dispatch_get_main_queue(), ^{
           [self performSelector:loopSelector withObject:nil afterDelay:cycleTime];
    });  
    

    By the way, this is definitely a threading issue. The documentation for performSelector:withObject:afterDelay: states that this will be performed on the current thread after the delay, but sometimes that thread's run loop is no longer active.

    A more detailed discussion on the subject can be found here

    0 讨论(0)
  • 2021-02-19 01:31

    Does your class still exist in memory?

    If your class goes away before the performSelector fires, do you wind up sending the message to nil (which would cause nothing to occur). You could test this by dropping an NSLog into your dealloc()

    You mentioned threads. If your performSelector isn't called from the MainThread it could cause issues (UI things should be done on the main thread).

    0 讨论(0)
  • 2021-02-19 01:36

    I got the same problem when I call performSelector:withObject:afterDelay: in a background thread created by ReactiveCocoa. If I execute the block in the ReactiveCocoa's way, the block will be called correctly:

     [[[RACSignal empty] delay:2.0] subscribeCompleted:^(){
        // do something
     }];
    

    I guess there is some magic in the ReactiveCocoa's threading model.

    0 讨论(0)
提交回复
热议问题