Objective-C и кварцевый композитор;[qcView pauseRendering] вызывает Bad_Access - PullRequest
2 голосов
/ 06 февраля 2011

спасибо заранее.

У меня есть Quartz Composer View (qcView ниже) и я перемещаю изображение (муравья, если вам интересно код) в произвольном направлении, пока оно не найдет его "дом" в середине QCView. PauseRendering необходим для того, чтобы мы могли видеть движение муравья дюйм за дюймом; без него муравей просто появится у себя дома.

while([self distance] > acceptableOffset){
    [qcView pauseRendering];
    [self moveTowardsDestination:@"home"];
    [qcView resumeRendering];
}

Это прекрасно работает для одного муравья.

Когда я добавляю в уравнение еще одного муравья, я использую очередь отправки и два блока.

    dispatch_async(queue, ^{
        [theAnt findCenter];
    });

    dispatch_async(queue, ^{
        [otherAnt findCenter];
    });

Когда запускается этот код, две тети сново спешат к своему дому - именно то поведение, которое мы ищем. Однако, когда я прекращаю выполнение и строю заново, я сразу же получаю Exc_Bad_Access где-то внутри метода [qcView pauseRendering]. После Clean & Build он будет отлично работать еще на один прогон. После удаления pauseRendering и resumeRendering муравьи мгновенно появятся у себя дома.

Очевидно, существует локальный для метода QCView pauseRendering массив, который постоянно растет и сжимается, и с помощью единственного QCView и нескольких блоков, обращающихся к нему, вы можете увидеть корень проблемы.

Я исследовал документацию QCView и не могу найти там вдохновения; документация по pauseRendering минимальна. Хотя я уверен, что никто из вас не попробовал что-то столь же глупое, как это, я надеюсь, что у кого-то будет опыт прагматической модификации QCView, и он сможет указать мне правильное направление (ошибаться ... читать «ЛЮБОЙ!») .

[Редактировать: я пробовал варианты «while (! [QcView isPausedRendering])», если это помогает.]

Ответы [ 2 ]

2 голосов
/ 06 февраля 2011

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

Весьма маловероятно. Если вы гадите с представлениями из отдельных потоков или очередей - даже не одновременно из фоновой очереди / потока - вы, скорее всего, нарушаете правила параллелизма QCView.

Я подозреваю, что вы должны манипулировать представлением из основного потока или, по крайней мере, из одного потока одновременно.

(к сожалению, я не смог найти какую-то конкретную информацию по этому поводу).

1 голос
/ 06 февраля 2011

Решил это.

Оказывается, я сильно переоценил проблему.Простое исправление использования

     usleep(10000);

Go figure.

Первоначально это было в коде, однако оно было заменено на dispatch_suspend ()Сном на линии непосредственно перед приостановкой достигается желаемая активность.

Если у кого-то возникнут похожие проблемы, напишите мне.

...