猫猫学iOS(五十四)多线程网络之NSOperation重要知识

猫猫分享,,必须精品

原创文章,欢迎转载。转载请注明:翟乃玉的博客 地址:?viewmode=contents

一:队列的类型与队列添加任务1: 主队列[NSOperationQueue mainQueue]添加到”主队列”中的操作,都会放到主线程中执行。2:非主队列[[NSOperationQueue alloc] init]添加到”非主队列”中的操作,都会放到子线程中执行。3:队列添加任务(void)addOperation:(NSOperation *)op;(void)addOperationWithBlock:(void (^)(void))block;二:常见用法1: 设置最大并发数

(1)并发数:同时执行的任务数.比如,同时开3个线程执行3个任务,并发数就是3。 (2)最大并发数:同一时间最多只能执行的任务的个数。 (3)最大并发数的相关方法。 – (NSInteger)maxConcurrentOperationCount; – (void)setMaxConcurrentOperationCount:(NSInteger)cnt; 说明:如果没有设置最大并发数,那么并发的个数是由系统内存和CPU决定的,可能内存多久开多一点,内存少就开少一点。 注意:num的值并不代表线程的个数,仅仅代表线程的ID。 提示:最大并发数不要乱写(5以内),不要开太多,一般以2~3为宜,因为虽然任务是在子线程进行处理的,但是cpu处理这些过多的子线程可能会影响UI,让UI变卡。

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{// 1.创建一个队列(非主队列)NSOperationQueue *queue = [[NSOperationQueue alloc] init];// 2.设置最大并发(最多同时并发执行2个任务)queue.maxConcurrentOperationCount = 2;// 3.添加操作到队列中(自动异步执行任务,并发)NSBlockOperation *operation1 = [NSBlockOperation blockOperationWithBlock:^{NSLog(@”下载图片1—%@”, [NSThread currentThread]);}];NSBlockOperation *operation2 = [NSBlockOperation blockOperationWithBlock:^{NSLog(@”下载图片2—%@”, [NSThread currentThread]);}];NSBlockOperation *operation3 = [NSBlockOperation blockOperationWithBlock:^{NSLog(@”下载图片3—%@”, [NSThread currentThread]);}];NSBlockOperation *operation4 = [NSBlockOperation blockOperationWithBlock:^{NSLog(@”下载图片4—%@”, [NSThread currentThread]);}];NSInvocationOperation *operation5 = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(download) object:nil];[queue addOperation:operation1];[queue addOperation:operation2];[queue addOperation:operation3];[queue addOperation:operation4];[queue addOperation:operation5];[queue addOperationWithBlock:^{NSLog(@”下载图片5—%@”, [NSThread currentThread]);}];[queue addOperationWithBlock:^{NSLog(@”下载图片6—%@”, [NSThread currentThread]);}];[queue addOperationWithBlock:^{NSLog(@”下载图片7—%@”, [NSThread currentThread]);}];[queue addOperationWithBlock:^{NSLog(@”下载图片8—%@”, [NSThread currentThread]);}];[queue addOperationWithBlock:^{NSLog(@”下载图片9—%@”, [NSThread currentThread]);}];}

效果:我们设置了9个模拟下载的操作,同一时间开启的线程最多为两个,注意,途中有2,3,4 三条线程,但是我们保证了再同一时间只有两条线程,2开始做事,后来不做了,就换线程3,4了。

2: 队列的其他操作取消所有的操作(void)cancelAllOperations;-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{// 1.创建一个队列(非主队列)NSOperationQueue *queue = [[NSOperationQueue alloc] init];NSBlockOperation *operation1 = [NSBlockOperation blockOperationWithBlock:^{NSLog(@”下载图片1—%@”, [NSThread currentThread]);}];NSBlockOperation *operation2 = [NSBlockOperation blockOperationWithBlock:^{NSLog(@”下载图片2—%@”, [NSThread currentThread]);}];NSBlockOperation *operation3 = [NSBlockOperation blockOperationWithBlock:^{NSLog(@”下载图片3—%@”, [NSThread currentThread]);}];NSBlockOperation *operation4 = [NSBlockOperation blockOperationWithBlock:^{NSLog(@”下载图片4—%@”, [NSThread currentThread]);}];NSInvocationOperation *operation5 = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(download) object:nil];[queue addOperation:operation1];[queue addOperation:operation2];[queue addOperation:operation3];[queue addOperation:operation4];[queue addOperation:operation5];[queue addOperationWithBlock:^{NSLog(@”下载图片5—%@”, [NSThread currentThread]);}];[queue addOperationWithBlock:^{NSLog(@”下载图片6—%@”, [NSThread currentThread]);}];[queue addOperationWithBlock:^{NSLog(@”下载图片7—%@”, [NSThread currentThread]);}];[queue addOperationWithBlock:^{NSLog(@”下载图片8—%@”, [NSThread currentThread]);}];[queue addOperationWithBlock:^{NSLog(@”下载图片9—%@”, [NSThread currentThread]);}];[queue cancelAllOperations]; }

结果图:

这个的用法其实是在管理内存时候用的

愚公因此敢移山,矢志不渝是前行,握紧拳头勇登攀,

猫猫学iOS(五十四)多线程网络之NSOperation重要知识

相关文章:

你感兴趣的文章:

标签云: