Когда методы GUI действительно выполняются? - PullRequest
0 голосов
/ 19 марта 2011

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

Итак, предположим, что в массиве 15 изображений, я отфильтрую их жестом 2 пальца, а затем, если я хочу что-то изменить в них, я могу сделать жест 3 пальца и получить тот же самый набор обратно. , только немного подправил (контрастность / яркость и пр.).

То, что я хочу, - это возможность обновлять imageView, который отображает изображения после получения первого изображения, чтобы дать пользователю представление о том, как будут выглядеть остальные в серии. Но независимо от того, что я пытаюсь, и независимо от того, сколько разных потоков я пытаюсь реализовать, я не могу обновить imageView до завершения всей загрузки. После завершения пакетной загрузки (которая обрабатывается в отдельном потоке) imageView обновляется новыми изображениями, и все отлично.

Первый шаг в этом процессе:

if(UIGestureRecognizerStateEnded == [recognize state]){
    [self preDownload:windowCounter Level:levelCounter ForPane:tagNumber];// Where this method is what gets the first image, and tries to set it to the imageView
    [self downloadAllImagesWithWL:windowCounter Level:levelCounter ForPane:tagNumber]; //And this method goes and gets all the rest of the images
}

Это мой метод предварительной загрузки:

-(void)preDownload:(int)window Level:(int)level ForPane:(int) pane{

int guidIndex = [[globalGuids objectAtIndex:pane] intValue];

UIImage *img = [DATA_CONNECTION getImageWithSeriesGUID:[guids objectAtIndex:guidIndex] ImageID:counter Window:window Level:level];

if(pane==0){
    NSLog(@"0");
    [imageView3 setImage:img];
}else if(pane==1){
    NSLog(@"1");
    [imageView31 setImage:img];
}else if(pane==2){
    NSLog(@"2");
    [imageView32 setImage:img];
}else if(pane==3){
    NSLog(@"3");
    [imageView33 setImage:img];
}



   }

Итак, разделив это на два разных метода (в данный момент нет реализуемых потоков, эти методы вызываются до всего этого), я подумал, что после завершения метода preDownload, что imageView обновится, а затем управление продолжится до метода downloadAllImagesWithWL, но это не так.

Я что-то упустил здесь? Что я могу сделать, чтобы обновить элементы GUI, прежде чем этот второй метод будет запущен?

Ответы [ 2 ]

0 голосов
/ 19 марта 2011

Вы правы. Однако viewn не будет обновляться, пока ваш код не достигнет runloop. Вы можете сделать 2 вещи:

  • Сделайте ваш метод downloadAllImagesWithWL асинхронным, чтобы он возвращался после того, как вы его вызвали, ваш основной поток достигает runloop, обновлений графического интерфейса, а метод загрузки сообщит вашей логике через обратный вызов, когда это будет сделано.

OR

  • Более простым хакерским (и плохим) решением было бы запустить runloop на некоторое время, прежде чем вызывать метод загрузки. Примерно так: [[NSRunloop currentRunLoop] runUnitlDate: [Date dateWithTimeIntervalSinceNow: 0.1]]; Он будет работать runloop в течение 0,1 секунды.
0 голосов
/ 19 марта 2011

Когда изображение установлено, изображение будет помечено как нужное для отображения. Фактическое отображение не произойдет до начала следующего цикла выполнения. В OS X вы можете использовать -display, чтобы сразу нарисовать представление, но я не думаю, что Apple создала публичный метод для этого на iOS. Однако, если следующий метод просто создает фоновый поток, он быстро вернется, и обновление экрана, вероятно, произойдет до завершения потока.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...