当前位置: 首页 > news >正文

iPhone 多线程编程

多线程之NSInvocationOperation


多线程编程是防止主线程堵塞,增加运行效率等等的最佳方法。而原始的多线程方法存在很多的毛病,包括线程锁死等。在Cocoa中,Apple提供了NSOperation这个类,提供了一个优秀的多线程编程方法。

本次介绍NSOperation的子集,简易方法的NSInvocationOperation:

@implementation MyCustomClass

- (void)launchTaskWithData:(id)data
{
    //创建一个NSInvocationOperation对象,并初始化到方法
    //在这里,selector参数后的值是你想在另外一个线程中运行的方法(函数,Method)
    //在这里,object后的值是想传递给前面方法的数据
    NSInvocationOperation* theOp = [[NSInvocationOperation alloc] initWithTarget:self
                    selector:@selector(myTaskMethod:) object:data];

    // 下面将我们建立的操作“Operation”加入到本地程序的共享队列中(加入后方法就会立刻被执行)
    // 更多的时候是由我们自己建立“操作”队列
    [[MyAppDelegate sharedOperationQueue] addOperation:theOp];
}

// 这个是真正运行在另外一个线程的“方法”
- (void)myTaskMethod:(id)data
{
    // Perform the task.
}

@end

一个NSOperationQueue 操作队列,就相当于一个线程管理器,而非一个线程。因为你可以设置这个线程管理器内可以并行运行的的线程数量等等。下面是建立并初始化一个操作队列:

@interface MyViewController : UIViewController {

    NSOperationQueue *operationQueue;
    //在头文件中声明该队列
}
@end

@implementation MyViewController

- (id)init
{
    self = [super init];
    if (self) {
        operationQueue = [[NSOperationQueue alloc] init]; //初始化操作队列
        [operationQueue setMaxConcurrentOperationCount:1];
        //在这里限定了该队列只同时运行一个线程
        //这个队列已经可以使用了
    }
    return self;
}

- (void)dealloc
{
    [operationQueue release];
    //正如Alan经常说的,我们是程序的好公民,需要释放内存!
    [super dealloc];
}

@end

简单介绍之后,其实可以发现这种方法是非常简单的。很多的时候我们使用多线程仅仅是为了防止主线程堵塞,而NSInvocationOperation就是最简单的多线程编程,在iPhone编程中是经常被用到的。

相关文章:

  • 面试中如何自我介绍如何回答我的优缺点
  • [常见问题]iPhone NSURLConnection delegate methods得不到调用
  • 内容管理系统(CMS)
  • 钱学森最后一次系统谈话:大学要有创新精神
  • 《程序员羊皮卷》走进Tech•Ed2009
  • 《程序员羊皮卷》走进Tech?Ed2009
  • Mondrian系列(三)-如何设计Mondrian的Schema(1)
  • 三大运营商的应用商店之路
  • OpenSSL介绍
  • 在Windows下编译OpenSSL(VS2005)【转】
  • 柏林墙倒塌20年纪念
  • 关于安装IBM的TDS的错误“error opening toollibs.cat”解决方法
  • 标记:博客访问量突破20万
  • iPhone开发指南-内存管理
  • 《火炬之光》中的“X射线”效果
  • (ckeditor+ckfinder用法)Jquery,js获取ckeditor值
  • 2017-08-04 前端日报
  • E-HPC支持多队列管理和自动伸缩
  • java概述
  • java取消线程实例
  • mongo索引构建
  • MySQL Access denied for user 'root'@'localhost' 解决方法
  • MySQL的数据类型
  • pdf文件如何在线转换为jpg图片
  • PHP的类修饰符与访问修饰符
  • redis学习笔记(三):列表、集合、有序集合
  • TypeScript实现数据结构(一)栈,队列,链表
  • UMLCHINA 首席专家潘加宇鼎力推荐
  • 给新手的新浪微博 SDK 集成教程【一】
  • 开源中国专访:Chameleon原理首发,其它跨多端统一框架都是假的?
  • 理解 C# 泛型接口中的协变与逆变(抗变)
  • 爬虫模拟登陆 SegmentFault
  • 前端知识点整理(待续)
  • 容器服务kubernetes弹性伸缩高级用法
  • 如何学习JavaEE,项目又该如何做?
  • 少走弯路,给Java 1~5 年程序员的建议
  • 使用 QuickBI 搭建酷炫可视化分析
  • 小程序button引导用户授权
  • ​水经微图Web1.5.0版即将上线
  • ​中南建设2022年半年报“韧”字当头,经营性现金流持续为正​
  • #stm32整理(一)flash读写
  • #WEB前端(HTML属性)
  • #每天一道面试题# 什么是MySQL的回表查询
  • #微信小程序:微信小程序常见的配置传旨
  • #我与Java虚拟机的故事#连载12:一本书带我深入Java领域
  • (007)XHTML文档之标题——h1~h6
  • (cos^2 X)的定积分,求积分 ∫sin^2(x) dx
  • (阿里云万网)-域名注册购买实名流程
  • (第9篇)大数据的的超级应用——数据挖掘-推荐系统
  • (附源码)springboot宠物管理系统 毕业设计 121654
  • (转)3D模板阴影原理
  • (转)C语言家族扩展收藏 (转)C语言家族扩展
  • (转)socket Aio demo
  • (轉貼)《OOD启思录》:61条面向对象设计的经验原则 (OO)
  • ***通过什么方式***网吧