首页 > GCD > iOS系统GCD学习(10):常见的错误

iOS系统GCD学习(10):常见的错误

  贴几段斯坦福大学关于gcd的代码,这段代码逐步演示了如何修正错误,其中用到的既是串行队列。
  1。这个是原始代码

- (void)viewWillAppear:(BOOL)animated
{
    NSData *imageData = [FlickrFetcher imageDataForPhotoWithURLString:photo.URL];
    UIImage *image = [UIImage imageWithData:imageData];
    self.imageView.image = image;
    self.imageView.frame = CGRectMake(0, 0, image.size.width, image.size.height);
    self.scrollView.contentSize = image.size;
}


  2。这个是采用gcdd的代码,里面有错误3处

- (void)viewWillAppear:(BOOL)animated
{
    dispatch_queue_t downloadQueue = dispatch_queue_create(“Flickr downloader”, NULL);
    dispatch_async(downloadQueue, ^{
         NSData *imageData = [FlickrFetcher imageDataForPhotoWithURLString:photo.URL];
         UIImage *image = [UIImage imageWithData:imageData];
         self.imageView.image = image;
         self.imageView.frame = CGRectMake(0, 0, image.size.width, image.size.height);
         self.scrollView.contentSize = image.size;
    });
}

  3。第一个错误,UI更新只能在主线程中 Problem! UIKit calls can only happen in the main thread!
改正后如下:

- (void)viewWillAppear:(BOOL)animated
{
    dispatch_queue_t downloadQueue = dispatch_queue_create(“Flickr downloader”, NULL);
    dispatch_async(downloadQueue, ^{
         NSData *imageData = [FlickrFetcher imageDataForPhotoWithURLString:photo.URL];
         <SPAN style="COLOR: #ff0000">dispatch_async(dispatch_get_main_queue(), ^{</SPAN>
             UIImage *image = [UIImage imageWithData:imageData];
             self.imageView.image = image;
             self.imageView.frame = CGRectMake(0, 0, image.size.width, image.size.height);
             self.scrollView.contentSize = image.size;
         });
}); 
}

  4。第二个错误,NSManagedObjectContext并不是线程安全的,gcd中访问成员变量有危险
Problem! NSManagedObjectContext is not thread safe,
so we can’t call photo.URL in downloadQueue’s t

  改正后如下:

- (void)viewWillAppear:(BOOL)animated
{
  <SPAN style="COLOR: #ff0000">  NSString *url = photo.URL;</SPAN>
    dispatch_queue_t downloadQueue = dispatch_queue_create(“Flickr downloader”, NULL);
    dispatch_async(downloadQueue, ^{
        NSData *imageData = [FlickrFetcher <SPAN style="COLOR: #ff0000">imageDataForPhotoWithURLString:url];</SPAN>
        dispatch_async(dispatch_get_main_queue(), ^{
            UIImage *image = [UIImage imageWithData:imageData];
            self.imageView.image = image;
            self.imageView.frame = CGRectMake(0, 0, image.size.width, image.size.height);
            self.scrollView.contentSize = image.size;
}); });
}

  5。第三个错误,队列创建后没有释放,内存泄露

- (void)viewWillAppear:(BOOL)animated
{
    NSString *url = photo.URL;
    dispatch_queue_t downloadQueue = dispatch_queue_create(“Flickr downloader”, NULL);
    dispatch_async(downloadQueue, ^{
        NSData *imageData = [FlickrFetcher imageDataForPhotoWithURLString:url];
        dispatch_async(dispatch_get_main_queue(), ^{
            UIImage *image = [UIImage imageWithData:imageData];
            self.imageView.image = image;
            self.imageView.frame = CGRectMake(0, 0, image.size.width, image.size.height);
            self.scrollView.contentSize = image.size;
}); 
});
  1. Thera 1月 9th, 2013 @ 11:34 | #1

    I’ve learn several excellent stuff here. Definitely value bookmarking for revisiting. I surprise how much effort you put to make the sort of great informative site.

  2. maillot football 4月 21st, 2013 @ 03:53 | #2

    I am so grateful for your post.Thanks Again.

  3. maillot foot enfant 4月 23rd, 2013 @ 04:40 | #3

    Awsome site! I am loving it!! Will come back again. I am taking your feeds also.

评论提交中, 请稍候...

留言


可以使用的标签: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>
Trackbacks & Pingbacks ( 0 )
  1. 还没有 trackbacks