Как я могу увидеть промежуточные обновления в моем пользовательском интерфейсе при отладке кода iPad? - PullRequest
1 голос
/ 10 февраля 2011

Я разрабатываю приложение, в котором я использую файл plist. В листе есть 21 пара ключ-значение. Каждая пара представляет собой словарь (тип) с 6 элементами. Словарь содержит набор изображений. В моей программе я использую путь для получения изображений. Мое требование состоит в том, чтобы изображения отображались по одному на imageView. Я сделал это успешно. Изображения выводятся именно из plist.

Итак, мой вопрос: могу ли я использовать отладчик, чтобы увидеть промежуточное выполнение plist? Когда я установил точки останова в своем коде и запустил с использованием отладчика, я смог войти в код, и изображения отобразились в представлении только после того, как было выполнено все выполнение plist с 21 парой ключ-значение. Как я могу видеть изображения в представлении при отладке каждой пары?

(void)setSequenceInfo:(NSDictionary *)sequenceInfo
{
    [self.subviews makeObjectsPerformSelector:@selector(removeFromSuperview)];
    self.sequenceQueue = [NSMutableArray array];

    //load the sequenceinfo dictionary
    [_sequenceInfo release];

    if (!sequenceInfo)
       return;

    _sequenceInfo = [sequenceInfo retain];

    //create one UIImageView by sequence
    NSMutableDictionary* views = [NSMutableDictionary dictionaryWithCapacity:[sequenceInfo count]];
    for (NSString* identifier in _sequenceInfo)
    {
        UIImageView* seqView = [[UIImageView alloc] initWithFrame:self.bounds];
        seqView.autoresizingMask = UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleWidth;
        seqView.contentMode = self.contentMode;

        //the image is hidden until its sequence is played
        seqView.hidden=YES;
        //add the newly created image view to our subviews
        [self addSubview:seqView];
        //also store it in our sequenceViews dictionary
        [views setValue:seqView forKey:identifier];

        [seqView release];
    }
    self.sequenceViews = views;
}

Ответы [ 2 ]

0 голосов
/ 11 февраля 2011

Делайте весь метод в фоновом потоке, но вызывайте вещи GUI в основном потоке. Например: [self executeSelectorOnMainThread: @selector (addSubview :) withObject: seqView waitUntilDone: YES]. Не забудьте создать пул авто-релиза в начале метода (тот, который работает в фоновом потоке) и опустошить его в конце.

0 голосов
/ 10 февраля 2011

Чтобы «увидеть» промежуточные результаты при использовании отладчика, вам придется изменить структуру вашего кода, чтобы вернуться к основному циклу выполнения, чтобы у UIImageView была возможность запустить и отобразить новое изображение. Вы можете установить таймер, который запускается периодически, и в процедуре таймера вы меняете изображение UIImageView на следующее в последовательности. Затем вы устанавливаете точку останова в методе обработчика таймера в gdb, и когда вы достигаете этой точки останова каждый раз, вы должны увидеть ранее отображенное изображение.

РЕДАКТИРОВАТЬ: вот еще некоторые детали, основанные на том, что я думаю, вы хотите сделать. Поймите, однако, что я думаю, что нет «волшебной палочки», чтобы можно было видеть изменения на экране, пока вы находитесь в отладчике. Вы должны вернуться к Run Loop, чтобы ваши виджеты UIKIt получали циклы для рисования сами.

Например, скажем, у вас есть этот метод:

- (void) updateTwoLabels:(NSString *)newText
{
    self.label1.text = newText;
    self.label2.text = newText;  // put breakpoint on this line
}

и вы хотите остановиться в отладчике непосредственно перед тем, как будет установлен текст label2, и увидеть, что label1 изменился. Ну, я думаю, что нет никакого способа сделать это, кроме как изменить ваш код и снова вызвать себя с executeSelector: withObject: afterDelay: чтобы основной цикл выполнения мог работать некоторое время, а затем снова вызвать ваш код:

BOOL callAgain = NO;
BOOL setLabel2 = YES;
- (void) updateTwoLabels:(NSString *)newText
{
    self.label1.text = newText;
    if ( setLabel2 )
        self.label2.text = newText;  // put breakpoint on this line
    if ( callAgain )
        [self performSelector:@selector(updateTwoLabels:) withObject:newText afterDelay:0];
}

таким образом, когда вы отлаживаете, вы можете установить callAgain в YES и установить Label2 в NO в gdbg и продолжать «продолжать», пока не увидите, что label1 изменился. Это основная техника.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...