Мне кажется, я помню кое-что об обновлении пользовательского интерфейса в главном потоке, может быть объяснением, однако моя проблема в том, что у меня есть UIScrollView с 1000+ изображениями в нем, и я написал процедуру, которая быстро переключит видимые изображения в представлении, чтобы показать их реальное изображение, и когда они не видны, они переключаются на изображение-заполнитель. Все изображения вне экрана имеют одинаковую заполнитель, что значительно снижает загрузку памяти.
Я написал два метода, которые включают / выключают следующие несколько плиток вида и запускаются, если вы прокручивали достаточно в определенном направлении. Прокрутка обнаруживается с помощью метода обратного вызова UIScrollViewDelegate scrollViewDidScroll.
Эта стратегия работает отлично, но прокрутка прокрутки немного нервная на медленных устройствах (iPad 1). Я хотел повысить производительность, поэтому подумал, что могу изменить код так, чтобы два метода, которые обновляют содержимое scrollview, были NSOperationInvocation, добавленные в NSOperationQueue.
Однако, когда я делаю это, даже если для приоритета установлено значение VeryHigh, подпрограммы не обновляют интерфейс, даже если кажется, что они вызваны, и очередь увеличивается при прокрутке. Наблюдаемое поведение состоит в том, что изображения сохраняют свои изображения-заполнители и не включаются.
Почему это не работает?
Код для вызова NSOperationInvation:
ImageThumbView *thumb = [boardThumbsArray objectAtIndex:lowestLoadedThumbTag - i];
[loadedThumbsArray addObject:thumb];
[thumb showThumbImage];
ImageThumbView является подклассом UIButton
- (void)showThumbImage {
if (thumbImagePath != nil) {
thumbImage = [UIImage imageWithData:[NSData dataWithContentsOfURL:[NSURL fileURLWithPath:thumbImagePath]]];
} else {
NSLog(@"%@", @"Cannot show thumb image: thumbImagePath is nil");
}
[self setBackgroundImage:thumbImage forState:UIControlStateNormal];
[self setNeedsDisplay];
}