iOS: как заставить фоновый поток перерисовывать вид в основном потоке

Мое приложение будет запрашивать базу данных 50 раз, а затем реагировать соответствующим образом, добавляя правильный UIImageView к другому UIImageView, который я затем хочу, чтобы приложение отображало немедленно в каждом цикле.

Увы, после многих ночей мне не удалось заставить его работать. Приложение не будет сразу отображать UIImageView. Сказав это, когда я увеличиваю или уменьшаю масштаб во время среднего цикла, появляются UIImageViews! Я должен что-то упустить...

Пока все коды работают, кроме последней части [UIScrollView PerformSelector....

Пожалуйста, помогите и заранее спасибо.

    UIScrollView *firstView;
    UIImageView *secondView;
    UIImageView *thirdView;
    NSOperationQueue *queue;
    NSInvocationOperation *operation;

    - (void)viewDidAppear:(BOOL)animated
    {
    queue = [NSOperationQueue new];
    operation = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(getData) object:nil];
    [queue addOperation:operation];
    }

    - (void) getData
    {
     for (i=0 ; i < 50 ; i++)

         {

            //All the codes to facilitate XML parsing here
            [nsXMLParser setDelegate:parser];
            [BOOL success = [nsXMLParser parse];

            if (success) 
            {   

                if ([parser.currentValue isEqualToString:@"G"])

                thirdView.image = greenTick.jpg;
                [secondView addSubview:thirdView];

            } 
            else 
            {
                NSLog(@"Error parsing document!");
            }
    } 
    [thirdView performSelectorOnMainThread:@selector(setNeedsDisplay) withObject:nil waitUntilDone: YES];
}

person user1843298    schedule 21.11.2012    source источник
comment
где находится thirdView? вы используете АРК?   -  person Michael Dautermann    schedule 22.11.2012
comment
Привет Михаил, спасибо за ответ. третье представление размещено в -(void)viewDidLoad. Как это, ThirdView = [[UIImageView alloc] init]; Я использую АРК.   -  person user1843298    schedule 22.11.2012


Ответы (1)


Я нашел решение и искренне надеюсь, что это поможет кому-то...

        if (success) 
        {   

            if ([parser.currentValue isEqualToString:@"G"])

            // Make the changes here - start
            dispatch_queue_t main_queue = dispatch_get_main_queue();
            dispatch_async(main_queue, ^{
            thirdView.image = greenTick.jpg;
            [secondView addSubview:thirdView];
            });
            // Make the changes here - end
        } 
        else 
        {
            NSLog(@"Error parsing document!");
        }
} 
// Remove performSelectorOnMainThread 
person user1843298    schedule 23.11.2012