Проблема с загрузкой UIImageView через OperationQueue - PullRequest
0 голосов
/ 12 апреля 2011

Я загружаю UIImageView, используя NSOperationQueue.

Загрузка извлекает изображение из Интернета, а затем добавляет его к просмотру изображения. У меня проблема в том, что метод завершается, но требуется около 3 секунд, чтобы представление изображения фактически показало изображение или удалило представление изображения из суперпредставления ...

- (void)viewDidLoad { NSLog(@"AirportDetailView: viewDidLoad");
    [super viewDidLoad];
    [self.activity startAnimating];
    self.queue = [NSOperationQueue new];
    NSInvocationOperation *operation = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(loadImage) object:NULL]; 
    [self.queue addOperation:operation]; 
    [operation release];
}

-(void)loadImage {
        [myAp ImageForAp];

        NSLog(@"ImageFor Ap Ended, %@",myAp.ApDiagram);

        [self.activity stopAnimating];

        if (myAp.ApDiagram==NULL) {
            NSLog(@"Finally Gets Here");
            [self.Diagram removeFromSuperview];
        }
        else {
            NSLog(@"Finally Gets Here with Diag");
            [self.Diagram setBackgroundImage:myAp.ApDiagram forState:UIControlStateNormal];
        }

    }

NSLOG показывает задержку между первыми двумя инструкциями журнала около 3 секунд, не может понять, почему ....

Обновлено с моим последним кодом ......

-(void)loadImage {

    [myAp ImageForAp];

    NSLog(@"ImageFor Ap Ended, %@",myAp.ApDiagram);

    [self performSelectorOnMainThread:@selector(UpdateUI) withObject:nil waitUntilDone:NO];
}

-(void)UpdateUI {

    [self.activity stopAnimating];

    if (myAp.ApDiagram==NULL) {
        NSLog(@"Finally Gets Here");
        [self.Diagram removeFromSuperview];
    }
    else {
        NSLog(@"Finally Gets Here with Diag");
        [self.Diagram setBackgroundImage:myAp.ApDiagram forState:UIControlStateNormal];
    }
}

1 Ответ

1 голос
/ 12 апреля 2011

Убедитесь, что метод loadImage запущен в главном потоке.Все операции пользовательского интерфейса должны выполняться в главном потоке, чтобы работать должным образом.Ваш код должен выглядеть примерно так:

-(void)loadImage {
    [myAp ImageForAp];
    [self performSelectorOnMainThread:@selector(UpdateUI) withObject:nil waitUntilDone:NO];
}

-(void)UpdateUI {
    [self.activity stopAnimating];

    if (myAp.ApDiagram==NULL) {
        [self.Diagram removeFromSuperview];
    }
    else {
        [self.Diagram setBackgroundImage:myAp.ApDiagram forState:UIControlStateNormal];
    }
}

Возможно также утечка памяти внутри viewDidLoad.

self.queue = [NSOperationQueue new]; следует изменить на

self.queue = [[[NSOperationQueue alloc] init] autorelease];

...