1

私はItunesUのStandfordコースで作業していますが、何かをダウンロードするためのスレッドはUIに何の影響も与えないはずであり、これはメインスレッドでのみ発生するはずだと言われています。

さて、私の例では、フリッカーから画像をダウンロードしていて、この画像を(セグエを介して)で設定したいと思いますUIScrollView。したがって、この画像を「サイド」スレッドでダウンロードしている間、画像のプロパティUIScrollviewを画像などに設定しています。ただし、画像サイズがまだわからないため、これは明らかに機能しません。その画像オブジェクトへの参照はまだ正しく設定されていませんか?

では、それをどのように処理しますか?私は明確であることを願っています..ここに私の例があります:

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(NSIndexPath *)sender{
NSDictionary *selectedPhoto = [self.photos objectAtIndex:sender.row];

    [self.defaults addPhotoToRecentlyViewed:selectedPhoto];
    [self.defaults saveDefaults];

    PhotoViewer *photoViewer = segue.destinationViewController;

    UIActivityIndicatorView *spinner = [[UIActivityIndicatorView alloc]initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleGray];
    photoViewer.navigationItem.rightBarButtonItem = [[UIBarButtonItem alloc]initWithCustomView:spinner];
    [spinner startAnimating];

    dispatch_queue_t photoDownload = dispatch_queue_create("photoviewever", nil);

    dispatch_async(photoDownload, ^{        
        NSData *data = [NSData dataWithContentsOfURL:[FlickrFetcher urlForPhoto:selectedPhoto format:FlickrPhotoFormatLarge]];
        UIImage *image = [UIImage imageWithData:data];
        photoViewer.image = image;

        dispatch_async(dispatch_get_main_queue(), ^{

            photoViewer.title = [selectedPhoto objectForKey:FLICKR_PHOTO_TITLE];
            photoViewer.navigationItem.rightBarButtonItem = nil;
        });
    });
}

と私のPhotoViewer:

#import "PhotoViewer.h"

@interface PhotoViewer ()

@property (nonatomic, strong) IBOutlet UIScrollView *scrollView;
@property (nonatomic, strong) IBOutlet UIImageView *imageView;

@end

@implementation PhotoViewer

@synthesize scrollView = _scrollView;
@synthesize imageView = _imageView;
@synthesize image = _image;

- (void)viewDidLoad
{
    [super viewDidLoad];

    self.scrollView.delegate = self;
    [self setupImage];
}

- (UIView *)viewForZoomingInScrollView:(UIScrollView *)scrollView{
    return self.imageView;
}

- (void)setupImage{
    self.imageView.image = self.image;
    self.imageView.frame = CGRectMake(0, 0, self.image.size.width, self.image.size.height);
    self.scrollView.contentSize = self.image.size;
    [self.imageView setNeedsDisplay];
}

@end
4

1 に答える 1

0

この行を移動する必要があります:

        photoViewer.image = image;

「完了」ブロックに、メインスレッドにディスパッチします。PhotoViewerはビューコントローラーのように見えるため、他のUIと同じ「メインスレッドのみ」のルールに従います。-setupImageまた、そのメインスレッドの「完了」ブロックから再度呼び出す必要があるようです。(そうしないと、ご指摘のとおり、画像が画像ビューにプッシュされることはありません。)

また、では、アドレス指定する前に、それがnil以外の値を返す-setupImageことを確認する必要があります。self.image使用しているコンパイラに応じて、構造体を返すObjective Cメソッドを呼び出す動作は「未定義」です(つまり、self.image.sizeはCGSize構造体を返します)。(最近のコンパイラでは、ゼロで埋められた構造体を返します。

于 2013-01-12T17:10:14.950 に答える