David Pollak
David Pollak

Reputation: 23

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");
}

Upvotes: 0

Views: 625

Answers (2)

paulbailey
paulbailey

Reputation: 5346

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];
}

Upvotes: 1

taskinoor
taskinoor

Reputation: 46027

It's not very clear how you are trying to solve the UI freeze problem by using timer. But if your UI is freezing due to downloading then you can try asynchronous loading instead of using timer or detaching another thread.

EDIT: Unless you configure a run loop for secondary thread, timer is not going to work from that thread. Check the run loop management in threading programming guide. This can be a far difficult work than to use asynchronous connection.

Upvotes: 0

Related Questions