Я столкнулся с подобной проблемой при попытке нарисовать кэшированные объекты CGPath в пользовательском MKOverlayView.
Может произойти сбой, потому что CGPath не может быть одновременно нарисован в нескольких потоках - это непрозрачный класс, который (как указано в документации) содержит указатель на текущую точку в своем массиве точек.Два или более потоков, выполняющих итерацию по этому массиву одновременно, пока они рисуют, может привести к неопределенному поведению и падению.
Я работал над этим, копируя объект CGPath в каждый поток рисования (содержащийся в блокировке мьютекса, чтобы предотвратить неполноекопирование):
//lock the object's cached data
pthread_mutex_lock(&cachedPathMutex);
//get a handle on the previously-generated CGPath (myObject exists on the main thread)
CGPathRef myPath = CGPathCreateCopy(myObject.cachedPath);
//unlock the mutex once the copy finishes
pthread_mutex_unlock(&cachedPathMutex);
// all drawing code here
CGContextAddPath(context, myPath);
...
...
CGPathRelease(myPath);
Если вас беспокоит нехватка памяти при копировании в каждом потоке, вы также можете работать непосредственно с кэшированными объектами CGPath, но мьютекс должен оставаться заблокированным во времявесь процесс рисования (какой тип поражает цель резьбового рисования):
//lock the object's cached data
pthread_mutex_lock(&cachedPathMutex);
//get a handle on the previously-generated CGPath (myObject exists on the main thread)
CGPathRef myPath = myObject.cachedPath;
// draw the path in the current context
CGContextAddPath(context, myPath);
...
...
//and unlock the mutex
pthread_mutex_unlock(&cachedPathMutex);
Я уточню свой ответ, сказав, что я не эксперт по многопоточному рисованию с помощью Quartz, только то, что этот подход решенсбой в моем сценарии.Удачи!
ОБНОВЛЕНИЕ: я пересмотрел этот код сейчас, когда вышла iOS 5.1.0, и похоже, что основной причиной проблемы, возможно, была ошибка в Quartz в iOS 5.0.x.При тестировании на iOS 5.1.0 с удаленными вызовами CGPathCreateCopy () и мьютексом я не вижу ни одного сбоя, произошедшего на iOS 5.0.x.
//get a handle on the previously-generated CGPath (myObject exists on the main thread)
CGPathRef myPath = myObject.cachedPath;
// all drawing code here
CGContextAddPath(context, myPath);
...
...
//drawing finished
Скорее всего, мы будем некоторое время поддерживать iOS 5.0.x, не помешает сохранить мьютекс в вашем коде (кроме небольшого снижения производительности) или просто запуститьпроверка версии перед нанесением.