0

アプリの起動時に、画像のない画面に UIImageViews を追加します。次に、使用して画像を 1 つずつ読み込みNSThread、それらのビューに設定します。すべての画像が読み込まれてスレッドが終了するまで、UiImageViews は空白のままです。に設定するとすぐに画像が表示されないのはなぜですか? 終了するのをUIImageView待つのはなぜですか?NSThread

画像ビューを追加するには:

for(i = value; i < val; i++){
    UIButton *newbutton = [UIButton buttonWithType:UIButtonTypeCustom];
    [newbutton setBackgroundColor:[UIColor whiteColor]];
    UIImageView *newback = [[UIImageView alloc] init];
    newback.contentMode = UIViewContentModeScaleAspectFit;
    [newback setFrame:CGRectMake(0, 0, 140, 140)];
    [newbutton addSubview:newback];
    height = MIN(300, newSize.height);
    [newbutton setFrame:CGRectMake(currentX, currentY, width, height)];
    newbutton.layer.cornerRadius = 10;
    newbutton.clipsToBounds = YES;
    [newbutton addTarget:self action:@selector(processButtonClick:) forControlEvents:UIControlEventTouchUpInside];
}

スレッドに画像を追加するには、次の関数を呼び出します。

for(i = value; i < val; i++){
    UIImage *newimage = [UIImage imageWithData:[NSData dataWithContentsOfURL:[NSURL    URLWithString:[NSString stringWithFormat:@“http://test.com/a.jpg”, hash]]]];
    UIButton *newbutton = (UIButton*)[self.subviews objectAtIndex:i];
    [((UIImageView*)[newbutton.subviews objectAtIndex:0]) newimage];
}
4

3 に答える 3

0

一般的に言えば、UIKitスレッドセーフではありません。バックグラウンド スレッドで URL からデータをフェッチし、メイン スレッドで画像を設定します。

編集:あなたのメインスレッドで次のようなことをしてください

dispatch_async(someDispatchQ, ^{
    [self functionToGetData];
});

そして内部でfunctionToGetData行う

for(i = value; i < val; i++){
    NSData *data = //get Data
    UIImage *newImage = //make image from data
    dispatch_async(dispatch_get_main_queue(), ^{
        [imageView setImage:newImage];
    });
}

これにより、バックグラウンド スレッドを使用してデータをフェッチしたり、イメージを作成したり、メイン スレッドを使用してイメージを設定したりすることができます。これにより、タイマーを使用して常にバックグラウンド スレッドをポーリングする必要がなくなります。これは、バックグラウンド スレッドが画像を受信するとすぐに自動的に画像設定をメイン スレッドにディスパッチするためです。

于 2013-11-09T04:41:09.447 に答える
0

使用 - インポート クラスImageDownloader.h & .m
リンク -> https://github.com/psychs/imagestore/tree/master/Classes/Libraries/ImageStore

// このメソッドを使用してダウンロードします

-(void)downloadImageWithURL:(NSString *)url{


    if(self.downloder)return; //If already downloading please stay away

    url=[NSString stringWithFormat:@"%@%0.0fx%0.0f/%@/%@",IMAGE_ENDPOINT,self.imgViewExhibitors.frame.size.width,self.imgViewExhibitors.frame.size.height,@"fit",[ImagePath forURLString:url]];

    self.downloder=[[ImageDownloader alloc] init];
    self.downloder.delegate=self;
    self.downloder.indicator=self.indicator;
    [self.downloder downloadImageWithURL:url];
}

-(void)imageDownloaded:(UIImage *)image forIndexPath:(NSIndexPath *)indexPath{
    if(image){
        //Put the downloaded image in dictionary to update while scrolling
        //[self.speakerData setObject:image forKey:@"image"];
        self.imgViewExhibitors.image=image;
    }
}
于 2013-11-09T07:46:32.613 に答える
0

簡単な修正は

for(i = value; i < val; i++){
    UIImage *newimage = [UIImage imageWithData:[NSData dataWithContentsOfURL:[NSURL    URLWithString:[NSString stringWithFormat:@“http://test.com/a.jpg”, hash]]]];
    UIButton *newbutton = (UIButton*)[self.subviews objectAtIndex:i];

    // this ensures that the UI update (setting the image) is done on the main thread.
    // This is important for the UI to update properly.
    dispatch_async(dispatch_get_main_queue(), ^{
         [((UIImageView*)[newbutton.subviews objectAtIndex:0]) setImage:newimage];
    }
}
于 2013-11-09T08:47:44.233 に答える