iOS 多线程技术2

NSOperation


  • NSInvocationOperation
        //创建一个队列
NSOperationQueue *queue = [[NSOperationQueue alloc] init]; //创建子任务,定义子任务必须是 NSOperation 的子类
NSInvocationOperation *op = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(dosomething:) object:@"NSInvocationOperation"]; //当把任务加入到队列后,自己主动开启线程
[queue addOperation:op];
  • NSBlockOperation
            //创建一个队列
NSOperationQueue *queue = [[NSOperationQueue alloc] init]; //创建 NSBlockOperation 对象
NSBlockOperation *operation = [NSBlockOperation blockOperationWithBlock:^{
[self doSomething];
}]; //加入队列
[queue addOperat:operation];

Demo:

以下我用NSOperation 的两种方法来创建一个样例,实现与上篇一样的功能,

#import "ViewController.h"

---

@interface ViewController ()
@property (weak, nonatomic) IBOutlet UIImageView *iamgeView;
@property (weak, nonatomic) IBOutlet UILabel *lable; @property (nonatomic, strong) NSOperationQueue *queue;
@end @implementation ViewController - (void)viewDidLoad {
[super viewDidLoad]; // 1.NSInvocationOperation
NSInvocationOperation *op = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(dosomething:) object:@"NSInvocationOperation"];
op.name = @"xiaoming"; NSOperationQueue *queue = [[NSOperationQueue alloc] init];
[queue addOperation:op]; NSLog(@"%@",queue.operations);
_queue = queue;
} - (void)dosomething:(NSString*)str
{
//耗时操作
[NSThread sleepForTimeInterval:3]; //须要在主线程中更新 UI
[self performSelectorOnMainThread:@selector(updateLable:) withObject:str waitUntilDone:YES];
}
- (void)updateLable:(NSString*)str
{
if ([[NSThread currentThread] isMainThread]) {
NSLog(@"主线程>>>%s",__func__);
}
_lable.text = str;
}
- (IBAction)btnAction:(UIButton *)sender { NSBlockOperation *blockOp = [NSBlockOperation blockOperationWithBlock:^{
//耗时操作
[NSThread sleepForTimeInterval:3]; //创建 url
NSString *urlStr = @"http://img.hb.aicdn.com/5a8f57157b47284724d09ffd2da28369731f8144ac9c-1XdZKJ_fw658";
NSURL *url = [NSURL URLWithString:urlStr];
NSData *data = [NSData dataWithContentsOfURL:url]; UIImage *image = [UIImage imageWithData:data]; //更新 UI
[self performSelectorOnMainThread:@selector(updateImageView:) withObject:image waitUntilDone:YES];
}];
[_queue addOperation:blockOp];
}
- (void)updateImageView:(UIImage*)img
{
if ([[NSThread currentThread] isMainThread]) {
NSLog(@"主线程>>>>>>%s",__FUNCTION__);
} _iamgeView.image = img;
} @end

执行结果:

2015-08-02 15:03:33.909 05-NSOperationDemo[3284:874300] (

“{name = ‘xiaoming’}”

)

2015-08-02 15:03:36.911 05-NSOperationDemo[3284:874300] 主线程>>>-[ViewController updateLable:]

2015-08-02 15:03:47.730 05-NSOperationDemo[3284:874300] 主线程>>>>>>-[ViewController updateImageView:]


iOS 多线程技术2的更多相关文章

  1. iOS多线程技术方案

    iOS多线程技术方案 目录 一.多线程简介 1.多线程的由来 2.耗时操作的模拟试验 3.进程和线程 4.多线程的概念及原理 5.多线程的优缺点和一个Tip 6.主线程 7.技术方案 二.Pthrea ...

  2. iOS多线程技术

    iOS多线程技术主要分配NSThread.NSOperation和GCD.下边来简单的介绍一下吧. 随性一点,就不按照顺序来了.所以先介绍一下NSOperation. ---------------- ...

  3. 浅谈iOS多线程

    浅谈iOS多线程 首先,先看看进程和线程的概念. 图1.1 这一块不难理解,重点点下他们的几个重要区别: 1,地址空间和资源:进程可以申请和拥有系统资源,线程不行.资源进程间相互独立,同一进程的各线程 ...

  4. iOS开发之多线程技术

    本篇争取一篇讲清讲透,依然将通过四大方面清晰的对iOS开发中多线程的用法进行详尽的讲解: 一.什么是多线程 1)多线程执行原理 2)线程与进程 3)多线程的优缺点 二.我们为什么要用多线程编程技术 三 ...

  5. iOS的三种多线程技术NSThread/NSOperation/GCD

    1.iOS的三种多线程技术 1.NSThread 每个NSThread对象对应一个线程,量级较轻(真正的多线程) 2.以下两点是苹果专门开发的"并发"技术,使得程序员可以不再去关心 ...

  6. 多线程技术在iOS开发中的使用

    进程和线程 要使用多线程,首先需要理解进程和线程这2个概念.这里我简单的说一下. 所谓进程对应的是一个应用程序,负责开辟内存空间供应用程序使用,但是进程不能执行任务(指令).一个进程至少包含一条线程, ...

  7. OS X 和iOS 中的多线程技术(上)

    OS X 和iOS 中的多线程技术(上) 本文梳理了OS X 和iOS 系统中提供的多线程技术.并且对这些技术的使用给出了一些实用的建议. 多线程的目的:通过并发执行提高 CPU 的使用效率,进而提供 ...

  8. OS X 和iOS 中的多线程技术(下)

    OS X 和iOS 中的多线程技术(下) 上篇文章中介绍了 pthread 和 NSThread 两种多线程的方式,本文将继续介绍 GCD 和 NSOperation 这两种方式.. 1.GCD 1. ...

  9. iOS的多线程技术

    iOS的三种多线程技术 1.NSThread 每个NSThread对象对应一个线程,量级较轻(真正的多线程) 2.以下两点是苹果专门开发的“并发”技术,使得程序员可以不再去关心线程的具体使用问题 ØN ...

随机推荐

  1. luogu3178 [HAOI2015]树上操作

    裸题 #include <iostream> #include <cstdio> using namespace std; typedef long long ll; int ...

  2. 基于UDP的交互的实例

    1.实现简单的客户端.服务端聊天交互 问题是:客户端不能单独一直发消息回复.. 服务端: import socket server=socket.socket(socket.AF_INET,socke ...

  3. rsa Round #71 (Div. 2 only)

    Replace A Time limit: 1000 msMemory limit: 256 MB   You are given a string SS containing only letter ...

  4. Educational Codeforces Round 38 (Rated for Div. 2)

    这场打了小号 A. Word Correction time limit per test 1 second memory limit per test 256 megabytes input sta ...

  5. pat 1036

    1036. 跟奥巴马一起编程(15) 时间限制 400 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 CHEN, Yue 美国总统奥巴马不仅呼吁所有人 ...

  6. 山东理工大学第七届ACM校赛-G 飞花的传送门

    G - 飞花的传送门 飞花壕最近手头比较宽裕,所以想买两个传送门来代步(夏天太热,实在是懒得走路).平面上有N个传送门,飞花壕想要挑两个距离最远的传送门带回家(距离为欧几里得距离,即两点之间直线距离) ...

  7. HDU2098 分拆素数和

    Problem Description 把一个偶数拆成两个不同素数的和,有几种拆法呢?   Input 输入包含一些正的偶数,其值不会超过10000,个数不会超过500,若遇0,则结束.   Outp ...

  8. jquery 遍历find()与children()的区别

    find():返回被选元素的后代元素.后代是子.孙.曾孙,依此类推. http://blog.csdn.net/zm2714/article/details/8117978 http://www.jb ...

  9. 10个JavaScript难点--摘抄

    1. 立即执行函数 立即执行函数,即Immediately Invoked Function Expression (IIFE),正如它的名字,就是创建函数的同时立即执行.它没有绑定任何事件,也无需等 ...

  10. 标准C程序设计七---117

    Linux应用             编程深入            语言编程 标准C程序设计七---经典C11程序设计    以下内容为阅读:    <标准C程序设计>(第7版) 作者 ...