`

iphone-GCD应用

 
阅读更多
//网络资源
// from: http://blog.csdn.net/favormm/article/details/6453260

//***************************************************************************//
//功能
1. 预定义了大量的要下载的图片URL
2. 创建一个GCD queue并开始下载图片
3. 在动画出现消失的时候,同时显示图片

//代码
@interface UIImageView (DispatchLoad)  
- (void) setImageFromUrl:(NSString*)urlString;  
- (void) setImageFromUrl:(NSString*)urlString   
              completion:(void (^)(void))completion;  
@end


#import "UIImageView+DispatchLoad.h"  
@implementation UIImageView (DispatchLoad)  
- (void) setImageFromUrl:(NSString*)urlString {  
    [self setImageFromUrl:urlString completion:NULL];  
}  
- (void) setImageFromUrl:(NSString*)urlString   
              completion:(void (^)(void))completion {  
      
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{  
          
        NSLog(@"Starting: %@", urlString);  
        UIImage *avatarImage = nil;   
        NSURL *url = [NSURL URLWithString:urlString];  
        NSData *responseData = [NSData dataWithContentsOfURL:url];  
        avatarImage = [UIImage imageWithData:responseData];  
        NSLog(@"Finishing: %@", urlString);  
          
        if (avatarImage) {  
            dispatch_async(dispatch_get_main_queue(), ^{  
                self.image = avatarImage;  
            });  
            dispatch_async(dispatch_get_main_queue(), completion);  
        }  
        else {  
            NSLog(@"-- impossible download: %@", urlString);  
        }  
    });     
}  
@end



//************************************************************************//

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

1。这个是原始代码
view plain
- (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处
view plain
- (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!
改正后如下:
view plain
- (void)viewWillAppear:(BOOL)animated  
{  
    dispatch_queue_t downloadQueue = dispatch_queue_create(“Flickr downloader”, NULL);  
    dispatch_async(downloadQueue, ^{  
         NSData *imageData = [FlickrFetcher imageDataForPhotoWithURLString:photo.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;  
         });  
    }); 
}  


4。第二个错误,NSManagedObjectContext并不是线程安全的,gcd中访问成员变量有危险
Problem! NSManagedObjectContext is not thread safe,
so we can’t call photo.URL in downloadQueue’s t
改正后如下:
view plain
- (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;  
        }); 
    });  
}  


5。第三个错误,队列创建后没有释放,内存泄露
view plain
- (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;  
        }); 
    });  
   dispatch_release(downloadQueue); //won’t actually go away until queue is empty 
}
分享到:
评论

相关推荐

    IOS应用源码之【应用】iphone-wireless-扫描WiFi信号.rar

    这个名为"iPhone-Wireless-ScanWiFi信号"的源码包,显然是一个专门用于扫描并显示周围可用WiFi信号的iOS应用示例。以下是根据标题、描述以及标签提炼出的相关知识点: 1. **Objective-C或Swift编程**: iOS应用...

    IOS应用源码之【应用】simple-iphone-image-processing(OpenCV).rar

    《iOS应用源码解析:基于OpenCV的简单iPhone图像处理》 在当今移动开发领域,iOS应用程序的开发已经成为一个热门话题。本篇文章将深入探讨一个名为"simple-iphone-image-processing"的项目,该项目是专门为iOS平台...

    iOS游戏应用源代码——acastr7-iPhone-Mario-Game-bd5c6ea.zip

    《iOS游戏应用源代码解析——acastr7-iPhone-Mario-Game》 在移动设备上,游戏开发一直是热门领域,特别是在iOS平台。本资源“acastr7-iPhone-Mario-Game-bd5c6ea.zip”提供了一个iOS平台上的马里奥游戏应用的源...

    iOS游戏应用源代码——gckjdev-HitGame_iPhone-1a30d6d.zip

    《iOS游戏应用源代码解析——gckjdev-HitGame_iPhone-1a30d6d.zip》 本文将深入探讨iOS游戏开发中的关键技术和流程,以gckjdev-HitGame_iPhone-1a30d6d.zip为例,这是一个实际的游戏应用源代码包。我们将从项目结构...

    iOS游戏应用源代码——Devint6669-cocos2d-iphone-bedca97.zip

    Cocos2D-iPhone是一个广泛使用的开源游戏引擎,特别适合于开发2D游戏,它提供了丰富的功能和易用性,使得开发者能够快速构建游戏应用。 在iOS平台上开发游戏,首先你需要熟悉Objective-C或Swift编程语言,因为Cocos...

    IOS应用源码之amatig-babel4iphone-732eed0.zip

    11. **性能优化**:考虑到移动设备的资源限制,应用可能包含内存管理和性能优化策略,如避免内存泄漏,使用惰性加载,或者利用GCD(Grand Central Dispatch)进行并发处理。 12. **App Store发布**:最后,完成开发...

    iOS实例开发源码——acastr7-iPhone-Mario-Game-bd5c6ea.zip

    这个压缩包文件“acastr7-iPhone-Mario-Game-bd5c6ea.zip”包含了一个iOS平台上的Mario游戏的实例开发源代码。这为我们提供了一个深入理解如何在iOS设备上构建类似经典游戏《马里奥》的移动应用的机会。通过分析这个...

    iPhone开发--游戏手柄

    4. **Cocoa Touch**:这是iOS应用程序的基础,提供了触摸事件处理机制。在游戏手柄的实现中,我们需要监听并处理这些触摸事件,将它们转换为游戏逻辑中的相应动作。 5. **SneakInput库**:标签中提到了"SneakInput...

    Head-First iphone development

    - **Grand Central Dispatch (GCD)**:用于执行异步任务和管理多线程的框架,提高应用的响应性和效率。 - **Operation Queues**:另一种处理异步任务的方式,提供更高级别的抽象和控制。 #### 7. **测试与调试** ...

    The-iPhone-Developers-Cookbook.zip_iPhone/iOS_Objective-C_

    9. **多线程与GCD**:Grand Central Dispatch(GCD)是苹果的并发编程工具,学习如何利用GCD处理后台任务,提高应用性能。 10. **动画与过渡**:了解如何使用Core Animation实现视图动画和页面过渡效果,提升用户...

    IOS应用源码之【应用】-iPhone eBooks.rar

    "IOS应用源码之【应用】-iPhone eBooks" 是一个针对iPhone电子书应用的源代码库,非常适合开发者深入探究iOS应用的设计和实现。这个压缩包包含了构建一个功能完备的电子书应用所需的全部代码,有助于开发者学习如何...

    iphone子龙山人博客-----源码一

    1. **iOS开发基础**:由于涉及到的是iPhone应用的源码,我们可以推测这将涉及到iOS平台的软件开发。iOS应用主要使用Objective-C或Swift编程语言编写,这两种语言在Apple的Xcode集成开发环境中使用。开发者需要掌握...

    Beginning iPhone Development:Exploring the iPhone SDK

    《iPhone开发基础教程》是一本专为初学者设计的指南,旨在帮助读者深入了解iPhone应用程序开发的基础知识和技术要点。本书通过全面而系统的讲解,覆盖了从环境搭建到实际应用开发的全过程,是学习iOS开发的理想入门...

    关东升主讲-精通IOS开发[IPHONE与IPAD应用开发课程视频]【分辨率1024×768】

    8. **多线程编程**:理解GCD(Grand Central Dispatch)和操作队列,提升应用性能和用户体验。 9. **动画与过渡**:利用Core Animation实现视图间的平滑过渡和动态效果,增强用户交互。 10. **App Store发布流程**:...

    IOS应用源码之【应用】-SOCKS Proxy for iPhone.rar

    【标题】"IOS应用源码之【应用】-SOCKS Proxy for iPhone.rar" 提供的是一个关于iOS平台上实现SOCKS代理的源代码。这个源码库专注于为iPhone设备构建一个SOCKS代理服务,这在进行网络调试、安全测试或者需要绕过特定...

    iPhone-Network-Programming.zip_MacOS编程_Objective-C_

    在iOS开发中,网络编程是不可或缺的一部分,尤其是在创建iPhone应用程序时。标题中的"IPhone-Network-Programming.zip"表明这是一个关于iPhone应用中网络编程的资源包,主要针对MacOS平台的开发,使用的编程语言是...

    IOS应用源码之【应用】NXTRover-iPhone控制乐高机器人.rar

    【标题】"IOS应用源码之【应用】NXTRover-iPhone控制乐高机器人.rar" 涉及的核心知识点主要集中在iOS开发、乐高机器人控制以及两者之间的交互。以下是关于这些知识点的详细说明: 1. **iOS应用开发**:这是整个项目...

    iOS网络高级编程-iPhone和iPad的企业应用开发.zip

    在iOS开发领域,网络编程是构建企业级应用的关键部分,特别是在iPhone和iPad上。本教程“iOS网络高级编程-iPhone和iPad的企业应用开发”聚焦于这个主题,旨在帮助开发者提升其在网络技术上的技能,以便创建功能强大...

    iphone SDK应用程序开发 源代码

    《iPhone SDK应用程序开发源代码》是一本专注于iPhone应用开发的专业书籍,其提供的源代码是学习和实践iOS开发的重要资源。本书旨在帮助开发者深入理解iPhone SDK,掌握如何利用它来构建功能丰富的应用程序,并最终...

Global site tag (gtag.js) - Google Analytics