0

NSOperationQueue を使用して UIImageView をロードします。

ロードは、インターネットから画像をフェッチし、それを画像ビューに追加します。私が抱えている問題は、メソッドが終了することですが、画像ビューが実際に画像を表示するか、スーパービューから画像ビューを削除するのに約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 は、最初の 2 つのログ ステートメント間の遅延が約 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];
    }
}
4

1 に答える 1

1

loadImageメソッドがメインスレッドで実行されていることを確認してください。期待どおりに動作するには、すべての UI 操作をメイン スレッドで実行する必要があります。コードは次のようになります。

-(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];

于 2011-04-12T19:49:19.230 に答える