Запланируйте задачу с низким приоритетом в главном потоке - PullRequest
4 голосов
/ 04 января 2012

У меня есть метод drawRect, который довольно медленный (100-200 мс).Чтобы сэкономить время, мне нужно кэшировать результаты.Я делаю фактическое кэширование так:

// some code to check if caching would be desirable goes here.  If it is desirable, then
UIGraphicsBeginImageContext(viewSize);
CGContextRef c = UIGraphicsGetCurrentContext();
[view.layer renderInContext: c];
UIImage* image = UIGraphicsGetImageFromCurrentImageContext();
[self.cachedImageArray addObject:image];
UIGraphicsEndImageContext();

Само кэширование может занять до 40 мс.Это все еще легко стоит.Но кеширование должно ждать, пока все не будет отображено, иначе все получится неправильно.Кроме того, кэширование является задачей с низким приоритетом.Как только все отобразится, возможно, что другие вещи будут продолжаться, и если это так, кэширование может подождать.Но поскольку он использует UIKit, он должен находиться в главном потоке.

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

1 Ответ

1 голос
/ 04 января 2012

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

- (void) drawRect:(CGRect)rect {
    do_rendering_here();
    // when rendering completed:
    NSThread *t = [[NSThread alloc] initWithTarget:self selector:@selector(doCaching:) object:c];
    [t start];
    [t release];
}

- (void) doCaching:(CGContextRef)ctx {
    // do whatever kind of caching is needed
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...