1、NSoperation是基于GCD封装的 dispatch_async(_Queue, ^{ //请求数据 NSData *data = [NSData dataWithContentURL...2、NSOperationQueue相对于GCD来说有以下优点: 提供了在 GCD 中不那么容易复制的有用特性。...在两种类型中,这些队列所处理的任务都使用 NSOperation 的子类来表述。...取消任务 //取消队列中的所有operation [queue cancelAllOperations]; //取消单个 [blockOperation cancel]; 暂停和恢复 [queue...你 可以在响应用户请求时,挂起一个 queue,来暂停等待中的任务。稍后 根据用户的请求,可以再次调用 setSuspended: 方法继续 Queue 中操作 的执行。
线程的串行 1个线程中任务的执行是串行的 如果要在1个线程中执行多个任务,那么只能一个一个地按顺序执行这些任务 也就是说,在同一时间内,1个线程只能执行1个任务 5....中 系统会自动将NSOperationQueue中的NSOperation取出来,并将取出的NSOperation封装的操作放到一条新线程中执行 4.1 NSOperation的创建 NSOperation...如果将NSOperation添加到NSOperationQueue(操作队列)中,系统会自动异步执行NSOperation中的操作 添加操作到NSOperationQueue中 - (void)...,不再执行,不可逆 [queue cancelAllOperations]; 注意:暂停和取消只能暂停或取消处于等待状态的任务,不能暂停或取消正在执行中的任务,必须等正在执行的任务执行完毕之后才会暂停,...如果想要暂停或者取消正在执行的任务,可以在每个任务之间即每当执行完一段耗时操作之后,判断是否任务是否被取消或者暂停。
这样看来它的使用真的很方便,并且默认会自动开启多线程异步执行,上面栗子的回调块中输出了当前线程可以看出并不是主线程,所以在回调中如果要进行UI的更新操作需要放到主线程中执行,相比使用NSURLConnection...键值对,数组中可以有多个这样的字典,每添加一个进度回调块和下载完成回调块就会把这个字典返回作为token,在取消任务方法中就会从数组中删除掉这个字典,但是只有当数组中的回调块字典全部被删除完了才会真正取消任务...,并将self传出去 在什么线程发送通知,就会在什么线程接收通知 为了防止其他监听通知的对象在回调方法中修改UI,这里就需要在主线程中发送通知 */...方法,标识这是一个并发任务 - (BOOL)isConcurrent { return YES; } 上面几个方法就是与NSOperation有关了,用于取消下载任务和设置相关属性值,具体作用就不再赘述了...NSURLSession对象来创建一个NSURLSessionDataTask的下载任务,并设置回调,在回调方法中接收数据并进行一系列通知和触发回调块。
任务和队列 任务:在同步函数和异步函数中执行 队列:用来存放任务(并发 串行) GCD会自动将队列中的任务取出,放到对应的线程,任务的取出遵循FIFO,即先入先出队列,First Input First...DISPATCH_QUEUE_PRIORITY_LOW (-2) // 低 #define DISPATCH_QUEUE_PRIORITY_BACKGROUND INT16_MIN // 后台 // 获取主队列 在主队列中的任务都会在主线程中执行...单例模式:在整个应用程序中,共享一份资源(这份资源只需要创建初始化1次) static id _person; + (instancetype)sharePerson { static dispatch_once_t...NSOperationQueue 使用NSOperationQueue创建队列:主队列和全局队列 // 创建一个其他队列(包括串行队列和并发队列) 放到这个队列中的NSOperation对象会自动放到子线程中执行...NSOperationQueue *queue = [[NSOperationQueue alloc] init]; // 创建一个主队列,放到这个队列中的NSOperation对象会自动放到子线程中执行
所以,问题来了,SDWebImage的哪一部分才工作在主线程?其实只有最上层的回调(在UIImageView+WebCache.m中)工作在主线程: ?...总之,不管下层的工作是不是在子线程,新旧版本中关于最后获取image数据并设置给ImageView的都是放在最上层回调,而这部分代码是在主线程执行,所以这个时候,是有这个滑动即暂停的效果的。...NSURLSession 取消下载的关键API - (void)cancelByProducingResumeData:(void (^)(NSData *resumeData))completionHandler..., NSError *error, BOOL finished) { 这个方法返回的是SDWebImageOperation类型的subOperation,目的是为了在取消的回调中及时取消本操作。...大错特错哦~ 真正的开始在哪里,在它重写NSOperation类的start{}方法 ?
3.在文件资源管理器中将其拖动到桌面,点击继续。...5.将文件拖回原来的文件夹中。 6.此时我们打开vs,创建一个项目时就会有这一行预处理指令了。
key的图片是否存在,完成后执行回调块 返回一个NSOperation,调用者可以随时取消查询 提供这个功能主要是因为在磁盘中查找真的很耗时,调用者可能在一段时间后就不查询了 这个NSOperation...更像是一个标记对象,标记调用者是否取消了查询操作,完美的利用了NSOperation的cancel方法 */ - (nullable NSOperation *)queryCacheOperationForKey...,所以直接就返回了NSOperation对象 NSOperation *operation = [NSOperation new]; //异步在ioQueue上查询 dispatch_async...(self.ioQueue, ^{ //ioQueue是串行的,而且磁盘操作很慢,有可能还没开始查询调用者就取消查询 //如果在开始查询后调用者再取消就没有用了,只有在查询前取消才有用...,比较精明的设计就是返回NSOperation对象,这个对象并不代表一个任务,仅仅利用了它的cancel方法和isCancelled属性,来取消磁盘查询。
123.png 而上面几个方法在实现时,都是调用的最后这个方法,只是设置了一些默认参数。...因为可能是UIImageView的动画图片,所以就去数组中一个个的取消。 如果是SDWebImage自定义的对象肯定会实现自定义的取消协议,则转换对象后取消。...否则直接将这个object从字典中删除。 至此,取消当前图片下载步骤完毕。 重点二 调用SDWebImageManager,创建下载图片的operation。...实现中多次使用dispatch_main_sync_safe 和dispatch_main_async_safe。他们俩分别对应两个宏,一是为防止在主线程执行主线程操作发生死锁;二是避免不必要的开销。...第七步 在cacheOperation的doneBlock中。如果图片取到了缓存图片,则直接将图片等信息通过completedBlock返回。
本系列文章主要讲解iOS中多线程的使用,包括:NSThread、GCD、NSOperation以及RunLoop的使用方法详解,本系列文章不涉及基础的线程/进程、同步/异步、阻塞/非阻塞、串行/并行,...removeDependency:(NSOperation *)op; //任务在队列里的优先级 typedef NS_ENUM(NSInteger, NSOperationQueuePriority...property (getter=isSuspended) BOOL suspended; //队列的名称 @property (nullable, copy) NSString *name; /* 取消队列中的所有任务...在官方文档中指出经自定义NSOperation子类有两种形式,并发和非并发,非并发形式只需要继承NSOperation类后实现main方法即可,而并发形式就比较复杂了,接下来会分别介绍两种形式。...并且实现了main方法,在官方文档中指出,非并发任务,直接调用main方法即可,调用之后就和调用普通对象的方法一样,使用当前线程来执行main方法,在本栗中即主线程,这个栗子没有什么特别奇特的地方,但其实也可以将其加入到队列中
在项目中使用 SDWebImage 来管理图片加载相关操作可以极大地提高开发效率,让我们更加专注于业务逻辑实现。...: NSStringFromClass([self class]); //具体的取消操作在UIView+WebCacheOperation中实现 [self sd_cancelImageLoadOperationWithKey...2.如果,没有缓存开始下载图片 3.下载完成做图片缓存 接下来看看如何查找缓存的 - (nullable NSOperation *)queryCacheOperationForKey:(nullable...doneBlock(image, nil, SDImageCacheTypeMemory); } return nil; } NSOperation...NSData *data = imageData; if (!
在iOS中可以这样获取一张网络图片 NSURL *url = [NSURL URLWithString:@"http://f.hiphotos.baidu.com/image/w%3D2048/...sign=91c1063e1f950a7b753549c43ee963d9/f31fbe096b63f624b6a9640b8544ebf81b4ca3c6.jpg"]; NSData *data...= [[NSData alloc] initWithContentsOfURL:url]; UIImage *img = [UIImage imageWithData:data]; 但是图片比较大的时候程序会卡在这里...networkActivityIndicatorVisible = YES; } //响应体 - (void)connection:(NSURLConnection *)connection didReceiveData:(NSData
当然你也可以使用SDWebImage中几个很棒的工具类,比如SDWebImageDownloader,用来下载图片。或者SDImageCache用来缓存图片或者NSData。...我们先来看看UIImageView+WebCache中的基本方法: 在UIImageView+WebCache类的最上面,很贴心的贴了一个使用例子,这也是我们很常见的tableViewCell加载图片的场景...在SDWebImageManager的downloadImageWithURL方法中创建operation并返回,保存在operationDictionary中。...在SDWebImageManager的downloadImageWithURL方法中,我们找到了赋值的地方 operation.cancelBlock = ^{ [subOperation...self.dataTask是NSURLSessionTask的实例,这里就是取消网络请求。说这么多,仅仅是取消了下载图片的网络请求。 已经写了不少了,把大头戏放到下一篇。
这里只为理解NSOperation及其派生类 真要应用到APP中 请下载成熟的第三方库 效果 ?...效果 下载多张图片时可控制线程并发数 分析 自定义NSOperation 执行下载操作 封装一个队列操作,创建N个线程,队列控制并发 通过线程tag查找对应图片 通过队列tag查找对应队列 缓存设置 内存缓存和磁盘缓存...下载数据 #import #import "Uinty.h" @interface DownloadOperation : NSOperation...int imageTag = self.imageStartTag + i; NSString *urlStr = self.urlArray[i]; //从内存缓存中读取图片...andTag:imageTag withQueueTag:self.tag]; } continue; } //从磁盘缓存中读取图片
NSURLSession是iOS7推出的与NSURLConnection并列的网络请求库,并且在iOS9中苹果宣布废弃NSURLConnection,NSURLSession从此正式步入历史舞台,大多数还在维护的网络相关的三方库都跟随苹果的脚步将底层...并且NSURLSession还向我们提供了指定任务回调的队列的Api,让我们方便的选择在主线程或子线程中回调。...我们知道NSOperation和NSURLSessionTask都是需要手动开启的,所以我们可以重写NSOperation的resume方法,可以同时开启下载任务。...同时我们知道添加到NSOperationQueue中的NSOperation会按需自动调用resume方法,所以我们可以成功的借助NSOperationQueue实现我们下载任务的相互依赖关系。...傲娇 ---- 恩,你在忍忍,这应该是我更新前最后一次做软广了=。
targetURL); //下载完成的回调块 typedef void(^SDWebImageDownloaderCompletedBlock)(UIImage * _Nullable image, NSData...delegate:self delegateQueue:nil]; } //在析构函数中调用...传入一个回调块字典的token BOOL canceled = [operation cancel:token.downloadOperationCancelToken]; //如果取消了就从字典中移除掉这个键值对...(void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didReceiveData:(NSData...经过两篇文章的源码讲解,SDWebImage关于图片下载的部分也就全部讲解完了,主要使用了自定义NSOperation子类,并在这个自定义NSOperation子类中通过一个可用的NSURLSession
[thread cancel]取消:并不会直接取消线程,只是给线程对象添加 isCancelled 标记。...(系统以先进先出的方式调度队列中的任务执行)。在GCD中有两种队列:串行队列和并发队列。 并发队列:线程可以同时一起进行执行。实际上是CPU在多条线程之间快速的切换。...将任务加入到队列中:将NSOperation对象添加到NSOperationQueue中。...的其他操作 取消队列NSOperationQueue的所有操作,NSOperationQueue对象方法 - (void)cancelAllOperations 取消NSOperation的某个操作...)isSuspended 暂停和取消不是立刻取消当前操作,而是等当前的操作执行完之后不再进行新的操作。
本文将引导您了解在 Flutter 和 Dart 中取消 future 的 3 种不同方法。 使用异步包(推荐) async包由 Dart 编程语言的作者开发和发布。...按钮的背景从靛蓝变为红色,其标签从“开始”变为“取消”,现在您可以使用它来取消Future。 如果您在Future完成前 5 秒内点击取消按钮,屏幕将显示“Future已被取消”。...一个演示价值超过一千字: 代码 1.通过执行以下操作安装异步包: flutter pub add async 然后运行: flutter pub get 2.main.dart 中的完整源代码(附解释...现在您可以取消对该流的订阅。...结论 你已经学会了不止一种方法来取消 Flutter 中的Future。从其中选择一个以在您的应用程序中实现,以使其在处理异步任务时更加健壮和吸引人。
Paste_Image.png ps: 使用NSInvocationOperation开启一个任务默认是在主线程中执行,只有添加到队列中才会开启新的线程。...可以在任意时间点取消一个operation,甚至在operation执行之前。尽管NSOperation提供了一个方法,让应用取消一个操作,但是识别出取消事件则是我们自己的事情。...以下地方可能需要调用isCancelled: 在开始执行任务之前。 在循环的每次迭代过程中,如果每个迭代相对较长可能需要调用多次。 代码中相对比较容易中止操作的任何地方。...ps: 使用依赖关系需要注意,依赖关系不局限于相同queue中的NSOperation对象,NSOperation对象会管理自己的依赖, 因此完全可以在不同的queue之间的NSOperation对象创建依赖关系...你可以在响应用户请求时,暂停一个queue来暂停等待中的任务。稍后根据用户的请求,可以再次调用setSuspended:方法继续queue中operation的执行。
线程间通讯 一、NSThread 1.简单说明 ①线程间通信:在1个进程中,线程往往不是孤立存在的,多个线程之间需要经常进行通信 ②线程间通信的体现 1个线程传递数据给另1个线程 在1个线程中执行完特定任务后...注意:虽然有时候可以在子线程中操作UI,但是开发中千万不要这样干因为如果是在子线程中操作UI, 有时候行, 有时候不行 - (void)viewDidLoad { // 1.给定图片的url...在dispatch_get_main_queue() 队列中 如果是通过异步函数调用, 那么会先执行完所有的代码, 再更新UI 如果是同步函数调用, 那么会先更新UI, 再执行其它代码 dispatch_queue_t...下载图片 NSData *data = [NSData dataWithContentsOfURL:url]; // 3.将NSData转换为图片 UIImage...self.imageView.image = image; NSLog(@"更新UI完毕"); }); NSLog(@"Other"); }); 三、NSOperation
它建立在NSURLConnection和NSOperation等类库的基础上,让很多网络通信功能的实现变得十分简单。...responseSeroalizer 也是 JSon 数据 manager.responseSerializer = [AFJSONResponseSerializer serializer]; //得到的是 NSData...dictionary constructingBodyWithBlock:^(id _Nonnull formData) { NSData...*data = UIImagePNGRepresentation([UIImage imageNamed:@"voiceChange"]); // NSData *data1 = UIImageJPEGRepresentation
领取专属 10元无门槛券
手把手带您无忧上云