DSBezelActivityView не работает

#iphone #objective-c #multithreading #uiactivityindicatorview

#iPhone #objective-c #многопоточность #uiactivityindicatorview

Вопрос:

Вот фрагмент кода, с которым у меня возникли проблемы:

 -(IBAction) nextRegister {
    [DSBezelActivityView newActivityViewForView:self.view.superview];
    previousPosition = (NSInteger *) currentPosition;
    currentPosition = (NSInteger *) ((int)currentPosition   (int) 1 );    
    [currentRegistry updateOnServer];
    [self loadNewRegisterInfos];
    [DSBezelActivityView removeViewAnimated:YES];
}
  

Строка за строкой, вот что делает (или должен делать) этот фрагмент:

Показать DSBezelActivityView (из этого:http://www.dejal.com/developer/dsactivityview )

Предыдущая позиция получает фактическую позицию (поскольку это приведет к переходу к следующей)

Следующий — текущий 1;

Обновляет запись на сервере (это занимает ~ 1 секунду)

Загружает новую запись и отображает на экране (это занимает максимум 1-3 секунды)

Эта строка удаляет DSBezelActivityView.

Итак, когда я нажимаю кнопку, чтобы загрузить следующую запись, предполагается, что она отображает ActivityView, загружает данные, затем обновляет экран и выпускает ActivityView. Но что происходит: приложение зависает на 3 секунды, показывает и закрывает представление активности менее чем за секунду, а затем завершает процедуру. Что не так?


[Отредактировано] Устранено! Это проблема с потоком. Разделить на 4 метода:

 -(IBAction) nextRegister {
    [NSThread detachNewThreadSelector:@selector(openActivityView) toTarget:self     withObject:nil];
    [self viewNextRegister];
    [self removeView];
}

-(void)viewNextRegister{
    previousPosition = (NSInteger *) currentPosition;
    currentPosition = (NSInteger *) ((int)currentPosition   (int) 1 );
    [currentRegister setScoreOnServer];
    //    [NSThread detachNewThreadSelector:@selector(loadRegisterInfo) toTarget:self withObject:nil];
    [self loadRegisterInfo];
}

-(void)openActivityView{
    [DSBezelActivityView newActivityViewForView:self.view.superview];
}

-(void)removeView {
    [DSBezelActivityView removeViewAnimated:YES];    
}
  

Ответ №1:

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

 -(void) doNextRegister {
    previousPosition = (NSInteger *) currentPosition;
    currentPosition = (NSInteger *) ((int)currentPosition   (int) 1 );    
    [currentRegistry updateOnServer];
    [self loadNewRegisterInfos];
    [DSBezelActivityView removeViewAnimated:YES];
}

-(IBAction) nextRegister {
    [DSBezelActivityView newActivityViewForView:self.view.superview];
    [self performSelector:@selector(doNextRegister) withObject:nil afterDelay:0.0];
}
  

Комментарии:

1. Фактически, оба этих селектора требуют опроса с авторелизом, поэтому «угроза» одинакова с потоками или без них.