私は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