UI-NSOperation线程

1、除NSThread之外的第二种多线程的编程方法

2、采用NSOperation(线程操作,通常用他的子类)和NSOperationQueue(线程队列)搭配来做多线程开发,采用NSOperation指定一个操作,把这个操作放到线程队列(线程池)中,让线程队列安排他的生命周期。

3、与NSThread有什么区别

(1)NSThread需要启动,也就是说需要费心管理线程的生命周期,而采用NSOperation方式只需要将线程放到线程队列中即可,线程队列负责管理、执行所有的线程操作

(2)管理线程的最大并发数,也就是同时执行的任务数

(3)控制线程之间的依赖关系,NSOperation之间可以设置依赖来保证执行顺序,比如一定要让操作1执行完后,才能执行操作2,线程之间不能相互依赖,不能A依赖B,B又依赖A

(4)队列的取消、暂停、恢复。

步骤:

1、创建视图

2、创建线程
       3、创建线程队列
       4、把线程放在线程队列中

5、在子线程加载网络资源

6、回到主线程

7、在主线程更新UI

下面以 NSBlockOperation和 NSOperationQueue 的搭配 为例:

 1 #pragma mark  NSBlockOperation和 NSOperationQueue 的搭配
 2
 3 - (void)viewDidLoad {
 4
 5     [super viewDidLoad];
 6
 7 //    1、创建视图
 8
 9         imageView = [[UIImageView alloc]initWithFrame:CGRectMake(50, 50, 200, 200)];
10
11         [self.view addSubview:imageView];
12
13 //    2、创建一个线程操作
14
15     NSBlockOperation *blockOperation = [NSBlockOperation blockOperationWithBlock:^{
16
17
18
19 //        5、加载网络资源
20
21         NSData *data = [NSData dataWithContentsOfURL:[NSURL URLWithString:kurl]];
22
23
24
25         UIImage *image = [UIImage imageWithData:data];
26
27
28
29 //        6、返回主线程
30
31         [[NSOperationQueue mainQueue]addOperationWithBlock:^{
32
33
34
35 //        7、在主线程更新UI
36
37             imageView.image =image;
38
39         }];
40
41     }];
42
43 //    3、创建一个线程队列
44
45     NSOperationQueue *operationQueue = [NSOperationQueue new];
46
47 //    4、把线程操作放到线程操作队列里
48
49     [operationQueue addOperation:blockOperation];
50
51 }
52
53 @end
时间: 2024-10-22 00:04:45

UI-NSOperation线程的相关文章

handler更新UI主线程

示例:下面代码的功能是修改UI主线程TextView的内容 public class MainActivity extends Activity { private Button btn_start; private TextView numTxtView; int i = 2; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContent

UI/Main线程

new Thread(new Runnable() { @Override public void run() { //处理ui线程的操作 // 方法1 runOnUiThread(new Runnable() { @Override public void run() { mTextView.setText("hello"); } }); //方法2 mTextView.post(new Runnable() { @Override public void run() { mText

有关子线程对UI的线程更新的说法

在 iOS开发过程中,我一直知道更新UI需要在主线程中,但也没怎么细想为什么要在主线程中,或者说为什么不能在子线程中更新UI. 像UIKit这样大的框架上确保线程安全是一个重大的任务,会带来巨大的成本.UIKit不是线程安全的,假如在两个线程中设置了同一张背景图片,很有可能就会由于背景图片被释放两次,使得程序崩溃.或者某一个线程中遍历找寻某个subView,然而在另一个线程中删除了该subView,那么就会造成错乱.apple有对大部分的绘图方法和诸如UIColor等类改写成线程安全可用,可还是

[C#参考]UI和线程(一)

Windows是一个多任务的系统,如果你使用的是windows 2000及其以上版本,你可以通过任务管理器查看当前系统运行的程序和进程. 什么是进程呢?当一个程序开始运行时,它就是一个进程,进程所指包括运行中的程序和程序所使用到的内存和系统资源.而一个进程又是由多个线程所组成的,线程是程序中的一个执行流,每个线程都有自己的专有寄存器(栈指针.程序计数器等),但代码区是共享的,即不同的线程可以执行同样的函数.多线程是指程序中包含多个执行流,即在一个程序中可以同时运行多个不同的线程来执行不同的任务,

UI处理 线程

runOnUiThread(new Runnable() { @Override public void run() { Drawable d = new BitmapDrawable(bitmap); iv_user_head.setImageDrawable(d); } }); 原文地址:https://www.cnblogs.com/zhaozilongcjiajia/p/10861004.html

线程间通信的三种方式(NSThread,GCD,NSOperation)

一.NSThread线程间通信 #import "ViewController.h" @interface ViewController ()<UIScrollViewDelegate> @property (strong, nonatomic) IBOutlet UIScrollView *scrollView; @property (weak, nonatomic)  UIImageView *imageView; @end @implementation ViewCo

iOS多线程全套:线程生命周期,多线程的四种解决方案,线程安全问题,GCD的使用,NSOperation的使用

目的 本文主要是分享iOS多线程的相关内容,为了更系统的讲解,将分为以下7个方面来展开描述. 多线程的基本概念 线程的状态与生命周期 多线程的四种解决方案:pthread,NSThread,GCD,NSOperation 线程安全问题 NSThread的使用 GCD的理解与使用 NSOperation的理解与使用 Demo在这里:WHMultiThreadDemo Demo的运行gif图如下: 一.多线程的基本概念 进程:可以理解成一个运行中的应用程序,是系统进行资源分配和调度的基本单位,是操作

使用异步消息处理更新UI线程

1. Android的UI时线程不安全的,如果在子线程中更新UI会出现异常,导致程序崩溃. 为了解决如上这些问题,我们常用的做法就是使用Android的异步消息机制实现即可(创建一个Message对象,使用Handler发送出去,然后在Handler的handleMessage()方法中获得刚才发送的Message对象,然后在这里进行UI操作).所以说还是很有必要了解异步消息机制的Looper , Handler , Message等原理的. 下面展示一个示例使用,然后通过源码分析吧. publ

android中子线程更新UI的方式浅析

一.为何写作此文 ??你是不是经常看到很多书籍中说:不能在子线程中操作ui,不然会报错.你是不是也遇到了如下的疑惑(见下面的代码): @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); tv = (TextView) findViewById(R.id.tv); Threa

iOS子线程操作UI问题检查

iOS开发中,因为大部分函数都不是线程安全的,所以UI子线程中操作UI是非常危险的事,但是有时候因为开发者经验不足,不知道子线程中不能UI,或者知道但是写代码的时候没注意,或者不知道那些函数操作UI了(比如UITableView的reload函数),造成这个问题时常发生,防不胜防,而且iOS不像安卓,一旦子线程中操作UI就直接崩溃,iOS中操作UI只是有可能崩,导致问题经常不好重现,而且经常奔溃堆栈是乱的,找不到出错的地方在哪儿,十分头疼. 本人写了一个简单的线程检查ui操作的库,当子线程操作u