Search code examples
iosobjective-ciphonenstimernsthread

Even using nsthread interface freezes


I have to perform a timer using a NSThread as I need to download text data from the web, and without that, in 3G connection it freezes the UI while downloading. So I've used a NSThread but it still freezes for a while and I don't know how to solve this....

Here's the code I'm using to perform the timer:

- (void)viewDidLoad{
  [NSThread detachNewThreadSelector:@selector(onTimerK2) toTarget:self withObject:nil];
}

- (void)onTimerK2{
 NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
 timer = [NSTimer scheduledTimerWithTimeInterval:15 target:self selector:@selector(onTimerKY2) userInfo:nil repeats:YES];
 [pool release];
}

- (void)onTimerKY2{
    NSLog(@"working");
}

Solution

  • You're detaching a new thread to call onTimerK2, which then immediately calls a method back on the main thread, which will of course freeze your interface.

    Edit

    You should be doing any long-running work not on the main thread (either yourself, or by using the asynchronous nature of NSURLConnection as mentioned elsewhere),and then updating your UI by calling selectors on the main thread as this activity progresses.

    Having said that, you may have more success with the following changes/reordering of your code:

    - (void)viewDidLoad {
        timer = [NSTimer scheduledTimerWithTimeInterval:15 
                                                 target:self 
                                               selector:@selector(onTimerK2) 
                                               userInfo:nil 
                                                repeats:YES];
    }
    
    - (void)onTimerK2{
        [NSThread detachNewThreadSelector:@selector(onTimerKY2) 
                                 toTarget:self 
                               withObject:nil];
    }
    
    - (void)onTimerKY2{
        NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
        NSLog(@"working");
        [pool release];
    }