文档章节

自定义NSOperation,模拟下载图片

BlogTenderness
 BlogTenderness
发布于 2016/01/14 00:04
字数 371
阅读 10
收藏 0
一.自定义Operation的目的:封装下载图片的操作
1.创建HMDownloaderOperation类,继承自NSOperation
2.重写自定义Operation的main方法
   (1) 重写- (void)main方法,在里面实现想执行的任务
   (2) 自己创建自动释放池(因为如果是异步操作,无法访问主线程的自动释放池)
   (3) 经常通过- (BOOL)isCancelled方法检测操作是否被取消,对取消做出响应
3.在controller中调用start方法,或者添加到队列。main方法会被调用
4.自定义Operation传参
//要下载的图片的地址
@property (nonatomic, copy) NSString *urlString;
//回调
 @property (nonatomic, copy) void (^finishedBlock)(UIImage *img);
5.断言的使用
//断言的使用
 NSAssert(self.finishedBlock != nil, @"finishedBlock 不能为nil");
       //下载网络图片
       NSURL *url = [NSURL URLWithString:self.urlString];
       NSData *data = [NSData dataWithContentsOfURL:url];      
       [NSThreadsleepForTimeInterval:1.0];
        //保存到沙盒
        if (data) {
            [data writeToFile:[self.urlString appendCachePath] atomically:YES];
         }

       //取消操作
        if (self.isCancelled) {
            return;
        }

       //主线程更新UI
        [[NSOperationQueuemainQueue] addOperationWithBlock:^{
            UIImage *img = [UIImage imageWithData:data]
            self.finishedBlock(img);
        }];

6.自定义Operation取消操作
if(self.isCancelled) {
            return;
}

7.controller中测试//获取随机的数字
    int  random = arc4random_uniform((u_int32_t)self.appInfos.count);

//随机获取模型
    HMAppInfo  *appInfo = self.appInfos[random];

   //判断当前要下载的图片,是不是刚刚下载过的
    if(![appInfo.icon isEqualToString:self.currentURLString]) {

        //取消操作
        [self.operationCache[self.currentURLString] cancel];
    }

       //记录当前显示的图片地址
        self.currentURLString = appInfo.icon;

//下载并设置图片
HMDownloaderOperation  *op = [HMDownloaderOperation downloaderOperationWithURLString:appInfo.iconfinishedBlock:^(UIImage *img) {
        self.imageview.image = img;
       //移除下载操作
        [self.operationCache removeObjectForKey:appInfo.icon];
    }];
    [self.queue addOperation:op];

   //缓存当前下载操作
    [self.operationCache setObject:op forKey:appInfo.icon];


© 著作权归作者所有

BlogTenderness
粉丝 0
博文 2
码字总数 3024
作品 0
程序员
私信 提问
多线程 NSThread,NSOperation,GCD

iOS中的线程 iOS主线程(UI线程),我们的大部分业务逻辑代码运行于主线程中。 没有特殊需求,不应引入线程增加程序复杂度。 应用场景:逻辑执行时间过长,严重影响交互体验(界面卡死)等。 iOS多线...

HelloSwift
2016/08/08
19
0
NSOperationQueue

NSOperation的作用配合使用NSOperation和NSOperationQueue也能实现多线程编程 NSOperation和NSOperationQueue实现多线程的具体步骤先将需要执行的操作封装到一个NSOperation对象中然后将NSO...

5vinsEnt
2016/05/25
10
0
多线程NSOperation一般使用

一、NSOperation简介 简单说明 NSOperation的作⽤:配合使用NSOperation和NSOperationQueue也能实现多线程编程 NSOperation和NSOperationQueue实现多线程的具体步骤: (1)先将需要执行的操...

朝雨晚风
2016/08/22
0
0
iOS多线程编程之NSOperation和NSOperationQueue的使用

目录(?)[-] iOS多线程编程之NSThread的使用 使用 NSOperation的方式有两种 一种是用定义好的两个子类 另一种是继承NSOperation NSInvocationOperation例子 第二种方式继承NSOperation 如何控...

malawo
2013/09/05
0
0
知其然亦知其所以然-NSOperation并发编程

对于iOS的并发编程, 用的最普遍的就是GCD了, GCD结合Block可以so easy的实现多线程并发编程. 但如果你看一些诸如AFNetworking, SDWebImage的源码, 你会发现它们使用的都是NSOperation, 纳尼?...

金小俊
2015/11/28
0
0

没有更多内容

加载失败,请刷新页面

加载更多

写一个线程安全的投票系统

有一个map,key存储候选人名称,value存储该候选人的得票数。请实现一个线程安全的投票系统. 为了测试并发环境下的表现,我们先设计一个小的“框架”,用来模拟并发情况下的投票行为。 首先设...

铁骨铮铮
42分钟前
2
0
今天的学习

php的类是通过关键字class来声明的,关键字后面是类名,然后是花括号,花括号里面是类的属性和方法。 类的属性和方法有四种格式,public,private,protected,finally。 意思是public(公有的...

墨冥
46分钟前
1
0
Issue和PR标签(Kubernetes社区Issue和PR标签解释)

一般标签 标签 含义 备注 good first issue 指示该issue适合由新贡献者参与 参照"help wanted"指导文档 help wanted 指示该issue需要帮助 必须满足"help wanted"指导文档 needs-kind 指示该i......

恋恋美食
今天
1
0
Array数组操作

includes() 方法用来判断一个数组是否包含一个指定的值,根据情况,如果包含则返回 true,否则返回false。 Eg:error.message.includes('timeout'); 1、indexOfindexOf()方法返回在该数组中第一...

lslaiwy
今天
2
0
运行pipenv报错UnicodeDecodeError的问题

问题:运行pipenv就报错:UnicodeDecodeError: 'utf-8' codec can't decode ...... 环境:windows10,python 3.7.1 解决:因为升级了一次3.7.3恰好有出了这问题,结果绕了很多弯路,以为是p...

编程老陆
今天
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部