Даже при использовании nsthread интерфейс зависает - PullRequest
0 голосов
/ 13 декабря 2010

Я должен выполнить таймер, используя NSThread, так как мне нужно загружать текстовые данные из Интернета, и без этого при подключении 3G он замораживает интерфейс во время загрузки. Итак, я использовал NSThread, но он все еще некоторое время зависает, и я не знаю, как это решить ....

Вот код, который я использую для выполнения таймера:

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

Ответы [ 2 ]

1 голос
/ 13 декабря 2010

Вы отсоединяете новый поток для вызова onTimerK2, который затем немедленно вызывает метод обратно в главном потоке, что, конечно, заморозит ваш интерфейс.

Редактировать

Вы должны выполнять любую длительную работу не в основном потоке (либо самостоятельно, либо используя асинхронную природу NSURLConnection, как упоминалось в другом месте), а затем обновлять свой пользовательский интерфейс, вызывая селекторы в основном потоке.по мере продвижения этой деятельности.

Сказав это, вы можете добиться большего успеха со следующими изменениями / переупорядочением вашего кода:

- (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];
}
0 голосов
/ 13 декабря 2010

Не очень понятно, как вы пытаетесь решить проблему зависания пользовательского интерфейса с помощью таймера. Но если ваш пользовательский интерфейс зависает из-за загрузки, вы можете попробовать асинхронную загрузку вместо использования таймера или отключения другого потока.

РЕДАКТИРОВАТЬ: Если вы не настроите цикл выполнения для вторичного потока, таймер не будет работать из этого потока. Проверьте управление циклами выполнения в руководстве по программированию потоков. Это может быть гораздо труднее, чем использовать асинхронное соединение.

...