попытаться использовать это для чего-то другого.

нальный вопрос ...............................................

Если вы продвинутый пользователь drawRect, вы будете знать, что drawRect, конечно же, на самом деле не будет работать до тех пор, пока «вся обработка не будет завершена».

setNeedsDisplay помечает представление как недействительное и ОС и в основном ждет, пока вся обработка не будет завершена. Это может приводить в бешенство в обычной ситуации, когда вы хотите иметь:

контроллер вида 1запускает некоторую функцию 2который постепенно 3создает все более сложные произведения искусства и 4на каждом шаге вы устанавливаете NeedsDisplay (неправильно!) 5пока вся работа не сделана 6

Конечно, когда вы делаете выше 1-6, все, что происходит, это то, что drawRect запускаетсятолько однажды после шага 6.

Ваша цель - обновить представление в пункте 5. Что делать?

Решение исходного вопроса ............................................. ,

Одним словом, вы можете(Задний фон большая картина и вызов на передний план для обновления пользовательского интерфейса или(В), возможно, спорно предлагается четыре «немедленных» метода, которые не используют фоновый процесс. Для результата того, что работает, запустите демонстрационную программу. У него есть #defines для всех пяти методов.

Поистине поразительное альтернативное решение, представленное Томом Свифтом ..................

Том Свифт объяснил удивительную идею довольно простоманипулирование циклом выполнения, Вот как вы запускаете цикл выполнения:

[[NSRunLoop currentRunLoop] runMode: NSDefaultRunLoopMode beforeDate: [дата NSDate]];

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

Странная проблема, которая возникает ............................................. ,

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

Прокрутите до «ответа», который я вставил ниже, показывая вывод консоли - вы можете видеть, как он постепенно замедляется.

Вот новый вопрос SO:
Загадочная проблема "прогрессивного замедления" в цикле выполнения / drawRect

Вот V2 демо-приложения ...
http://www.fileswap.com/dl/p8lU3gAi/stepwiseDrawingV2.zip.html

Вы увидите, что тестирует все пять методов,

#ifdef TOMSWIFTMETHOD
 [self setNeedsDisplay];
 [[NSRunLoop currentRunLoop]
      runMode:NSDefaultRunLoopMode beforeDate:[NSDate date]];
#endif
#ifdef HOTPAW
 [self setNeedsDisplay];
 [CATransaction flush];
#endif
#ifdef LLOYDMETHOD
 [CATransaction begin];
 [self setNeedsDisplay];
 [CATransaction commit];
#endif
#ifdef DDLONG
 [self setNeedsDisplay];
 [[self layer] displayIfNeeded];
#endif
#ifdef BACKGROUNDMETHOD
 // here, the painting is being done in the bg, we have been
 // called here in the foreground to inval
 [self setNeedsDisplay];
#endif

Вы можете сами увидеть, какие методы работают, а какие нет.

Вы можете увидеть странное «прогрессивное замедление». почему это происходит?

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

Таким образом, подавляющая вещь - это странное «прогрессивное замедление»: на каждой итерации, по неизвестным причинам, время, затрачиваемое на цикл, уменьшается. Обратите внимание, что это относится как к тому, чтобы делать это «правильно» (фоновый вид), так и к использованию одного из «непосредственных» методов.

Практические решения ........................

Для тех, кто читает в будущем, если вы не сможете заставить его работать в производственном коде из-за «загадочного прогрессирующего замедления» ... Felz и Void представили поразительные решения в другом конкретном вопросе, надеюсь, это поможет.

Ответы на вопрос(9)

Ваш ответ на вопрос