iOS开发多线程篇-NSThread

简介: 上篇我们学习了iOS多线程解决方式中的NSOperation,这篇我主要概况总结iOS多线程中NSThread的解决方式和基本用例

一.iOS多线程对比


1. NSThread


每个NSThread对象对应一个线程,真正最原始的线程


  • 优点:NSThread轻量级最轻,相对简单


  • 缺点:手动管理所有的线程活动,如生命周期、线程同步、睡眠等


2. NSOperation


自带线程管理的抽象类


  • 优点:自带线程周期管理,操作上可更注重自己逻辑


  • 缺点:面向对象的抽象类,只能实现它或者使用它定义好的两个子类:NSInvocationOperationNSBlockOperation


3. GCD


Grand Central Dispatch 是Apple开发的一个多核编程的解决方法。


  • 优点:最高效,避开并发陷阱


  • 缺点:基于C实现


4. 选择小结


  • 简单而安全的选择NSOperation实现多线程即可


  • 处理大量并发数据,又追求性能效率的选择GCD


  • NSThread较麻烦,不建议使用


二. 场景选择


  1. 图片异步加载:这种常见的场景是最常见也是必不可少的,异步加载图片又分成两种


  • 在UI主线程开启新线程按顺序加载图片,加载完成刷新UI


  • 依然是在主线程开启新线程,顺序不定的加载图片,加载完成后刷新UI


  1. 创作工具上的异步:这个跟上边任务调度道理差不多,只是为了丰富描述,有助于“举一反三”效果,如下描述的是APP创作小说


  • app本地创作10个章节内容完成同步服务器,接着同时发表这10个章节将产生的一系列动作,其中上传内容,获取分配章节Id,如果后台没有做处理最好方式做异步按顺序执行。


  • app本地创作列表中有3本小说要发表,如果同时发表创作列表中的3本小说,自然考虑并行队列执行发表。


三.使用方法


1. 三种实现开启线程方式:


动态实例化

NSThread * thread = [[NSThread alloc] initWithTarget:self selector:@selector(loadImageSource:) object:imgUrl];
    thread.threadPriority = 1;  //设置线程的优先级(0.0 - 1.0, 1.0最高级)
    [thread start];


静态实例化

[NSThread detachNewThreadSelector:@selector(loadImageSource:) toTarget:self withObject:imgUrl];


隐式实例化

[self performSelectorOnMainThread:@selector(loadImageSource:) withObject:self waitUntilDone:imgUrl];


代码示例:

//
//  ViewController.m
//  TestNSThread
//
//  Created by taobaichi on 2017/3/21.
//  Copyright © 2017年 MaChao. All rights reserved.
//
#import "ViewController.h"
#define imgUrl @"http://avatar.csdn.net/2/C/D/1_totogo2010.jpg"
@interface ViewController ()
@property (nonatomic, strong) UIImageView * imageView;
@end
@implementation ViewController
- (void)viewDidLoad {
    [super viewDidLoad];
    self.imageView = [[UIImageView alloc]initWithFrame:CGRectMake(self.view.frame.size.width /2 - 100, self.view.frame.size.height / 2 - 100, 200, 200)];
    self.imageView.backgroundColor = [UIColor purpleColor];
    [self.view addSubview:self.imageView];
    [self dynamicCreateThread];
}
//动态创建线程
-(void)dynamicCreateThread{
    NSThread * thread = [[NSThread alloc] initWithTarget:self selector:@selector(loadImageSource:) object:imgUrl];
    thread.threadPriority = 1;  //设置线程的优先级(0.0 - 1.0 1.0最高级)
    [thread start];
}
//静态创建线程
-(void)staticCreateThread{
    [NSThread detachNewThreadSelector:@selector(loadImageSource:) toTarget:self withObject:imgUrl];
}
//隐式创建线程
-(void)implicitCreateThread{
    [self performSelectorInBackground:@selector(loadImageSource:) withObject:imgUrl];
}
-(void)loadImageSource:(NSString *)url
{
    NSData * imgData = [NSData dataWithContentsOfURL:[NSURL URLWithString:url]];
    UIImage * image = [UIImage imageWithData:imgData];
    if (imgData != nil) {
        //回到主线程刷新UI
        [self performSelectorOnMainThread:@selector(refreshImageView:) withObject:image waitUntilDone:YES];
    }else{
        NSLog(@"there no image data");
    }
}
-(void)refreshImageView:(UIImage *)image{
    [self.imageView setImage:image];
}
@end


2. NSThread的拓展认识


获取当前线程

NSThread * current = [NSThread currentThread];


获取主线程

NSThread * main = [NSThread mainThread];


暂停当前线程

[NSThread sleepForTimeInterval:2.0];


线程之间通信

//在指定线程上执行
    [self performSelector:@selector(refreshImageView:) onThread:thread withObject:image waitUntilDone:YES];
    //在主线程执行
    [self performSelectorOnMainThread:@selector(refreshImageView:) withObject:image waitUntilDone:YES];
    //在后台执行
    [self performSelectorInBackground:@selector(refreshImageView:) withObject:image];
    //在当前 线程上执行
    [self performSelector:@selector(refreshImageView:) withObject:image];


相关文章
|
1月前
|
API 数据安全/隐私保护 iOS开发
利用uni-app 开发的iOS app 发布到App Store全流程
利用uni-app 开发的iOS app 发布到App Store全流程
92 3
|
3月前
|
存储 iOS开发
iOS 开发,如何进行应用的本地化(Localization)?
iOS 开发,如何进行应用的本地化(Localization)?
122 2
|
3月前
|
存储 数据建模 数据库
IOS开发数据存储:什么是 UserDefaults?有哪些替代方案?
IOS开发数据存储:什么是 UserDefaults?有哪些替代方案?
40 0
|
10天前
|
API 定位技术 iOS开发
IOS开发基础知识:什么是 Cocoa Touch?它在 iOS 开发中的作用是什么?
【4月更文挑战第18天】**Cocoa Touch** 是iOS和Mac OS X应用的核心框架,包含面向对象库、运行时系统和触摸优化工具。它提供Mac验证的开发模式,强调触控接口和性能,涵盖3D图形、音频、网络及设备访问API,如相机和GPS。是构建高效iOS应用的基础,对开发者至关重要。
12 0
|
25天前
|
开发工具 Swift iOS开发
利用SwiftUI构建动态用户界面:iOS开发新范式
【4月更文挑战第3天】 随着苹果不断推进其软件开发工具的边界,SwiftUI作为一种新兴的编程框架,已经逐渐成为iOS开发者的新宠。不同于传统的UIKit,SwiftUI通过声明式语法和强大的功能组合,为创建动态且响应式的用户界面提供了一种更加简洁高效的方式。本文将深入探讨如何利用SwiftUI技术构建具有高度自定义能力和响应性的用户界面,并展示其在现代iOS应用开发中的优势和潜力。
|
1月前
|
存储 消息中间件 缓存
C++ Qt开发:运用QThread多线程组件
Qt 是一个跨平台C++图形界面开发库,利用Qt可以快速开发跨平台窗体应用程序,在Qt中我们可以通过拖拽的方式将不同组件放到指定的位置,实现图形化开发极大的方便了开发效率,本章将重点介绍如何运用`QThread`组件实现多线程功能。
27 2
C++ Qt开发:运用QThread多线程组件
|
2月前
|
监控 API Swift
用Swift开发iOS平台上的上网行为管理监控软件
在当今数字化时代,随着智能手机的普及,人们对于网络的依赖日益增加。然而,对于一些特定场景,如家庭、学校或者企业,对于iOS设备上的网络行为进行管理和监控显得尤为重要。为了满足这一需求,我们可以利用Swift语言开发一款iOS平台上的上网行为管理监控软件。
204 2
|
3月前
|
数据可视化 iOS开发
iOS 开发,什么是 Interface Builder(IB)?如何使用 IB 构建用户界面?
iOS 开发,什么是 Interface Builder(IB)?如何使用 IB 构建用户界面?
40 4
|
3月前
|
iOS开发
iOS开发解释 App 生命周期,包括各个阶段的调用顺序。
iOS开发解释 App 生命周期,包括各个阶段的调用顺序。
28 1
|
3月前
|
存储 安全 数据安全/隐私保护
IOS开发数据存储:解释一下 iOS 中的 Keychain,它的作用是什么?
IOS开发数据存储:解释一下 iOS 中的 Keychain,它的作用是什么?
92 4