仓酷云

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 1638|回复: 19
打印 上一主题 下一主题

[学习教程] IOS编程之iOS多线程编程手艺之NSThread、Cocoa NSOperation、GCD仓酷云

[复制链接]
金色的骷髅 该用户已被删除
跳转到指定楼层
楼主
发表于 2015-1-18 11:30:22 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
如果同时支持iOS5和iOS4用宏判断下就可以当然也可以直接用assign)还有一点开始学习的时候肯定很疑惑内存管理是基于函数名称的比如带alloccopy的函数用了之后返回的对象一定要release1、简介:

1.1iOS有三种多线程编程的手艺,分离是:

1.、NSThread
2、CocoaNSOperation(iOS多线程编程之NSOperation和NSOperationQueue的利用)
3、GCD全称:GrandCentralDispatch(iOS多线程编程之GrandCentralDispatch(GCD)先容和利用)
这三种编程体例从上到下,笼统度条理是从低到高的,笼统度越高的利用越复杂,也是Apple最保举利用的。
这篇我们次要先容和利用NSThread,前面会持续2、3的解说和利用。
1.2三种体例的出缺点先容:

NSThread:
长处:NSThread比其他两个轻量级
弱点:必要本人办理线程的性命周期,线程同步。线程同步对数据的加锁会有必定的体系开支
NSThread完成的手艺有上面三种:
Technology
Description
Cocoathreads
CocoaimplementsthreadsusingtheNSThreadclass.CocoaalsoprovidesmethodsonNSObjectforspawningnewthreadsandexecutingcodeonalready-runningthreads.Formoreinformation,see“UsingNSThread”and“UsingNSObjecttoSpawnaThread.”
POSIXthreads
POSIXthreadsprovideaC-basedinterfaceforcreatingthreads.IfyouarenotwritingaCocoaapplication,thisisthebestchoiceforcreatingthreads.ThePOSIXinterfaceisrelativelysimpletouseandoffersampleflexibilityforconfiguringyourthreads.Formoreinformation,see“UsingPOSIXThreads”
MultiprocessingServices
MultiprocessingServicesisalegacyC-basedinterfaceusedbyapplicationstransitioningfromolderversionsofMacOS.ThistechnologyisavailableinOSXonlyandshouldbeavoidedforanynewdevelopment.Instead,youshouldusetheNSThreadclassorPOSIXthreads.Ifyouneedmoreinformationonthistechnology,seeMultiprocessingServicesProgrammingGuide.
一样平常利用cocoathread手艺。
Cocoaoperation
长处:不必要体贴线程办理,数据同步的事变,能够把精神放在本人必要实行的操纵上。
Cocoaoperation相干的类是NSOperation,NSOperationQueue。NSOperation是个笼统类,利用它必需用它的子类,能够完成它大概利用它界说好的两个子类:NSInvocationOperation和NSBlockOperation。创立NSOperation子类的对象,把对象增加到NSOperationQueue行列里实行。
GCD
GrandCentralDispatch(GCD)是Apple开辟的一个多核编程的办理办法。在iOS4.0入手下手以后才干利用。GCD是一个替换诸如NSThread,NSOperationQueue,NSInvocationOperation等手艺的很高效和壮大的手艺。如今的iOS体系都晋级到6了,以是不必忧虑该手艺不克不及利用。
先容完这三种多线程编程体例,我们这篇先先容NSThread的利用。
2、NSThread的利用

2.1NSThread有两种间接创立体例:

-(id)initWithTarget:(id)targetselector:(SEL)selectorobject:(id)argument
+(void)detachNewThreadSelector:(SEL)aSelectortoTarget:(id)aTargetwithObject:(id)anArgument
第一个是实例办法,第二个是类办法

  • 1、[NSThreaddetachNewThreadSelector:@selector(doSomething:)toTarget:selfwithObject:nil];
  • 2、NSThread*myThread=[[NSThreadalloc]initWithTarget:self
  • selector:@selector(doSomething:)
  • object:nil];
  • [myThreadstart];
2.2参数的意义:

selector:线程实行的办法,这个selector只能有一个参数,并且不克不及有前往值。
target:selector动静发送的对象
argument:传输给target的独一参数,也能够是nil
第一种体例会间接创立线程而且入手下手运转线程,第二种体例是先创立线程对象,然后再运转线程操纵,在运转线程操纵前能够设置线程的优先级等线程信息
2.3PS:不显式创立线程的办法:

用NSObject的类办法performSelectorInBackground:withObject:创立一个线程:
[ObjperformSelectorInBackground:@selector(doSomething)withObject:nil];
2.4下载图片的例子:

2.4.1新建singeViewapp

新建项目,并在xib文件上安排一个imageView控件。按住control键拖到viewControll
er.h文件中创立imageViewIBOutlet
ViewController.m中完成:

  • //
  • //ViewController.m
  • //NSThreadDemo
  • //
  • //Createdbyrongfzhon12-9-23.
  • //Copyright(c)2012年rongfzh.Allrightsreserved.
  • //

  • #import"ViewController.h"
  • #definekURL@"http://avatar.csdn.net/2/C/D/1_totogo2010.jpg"
  • @interfaceViewController()

  • @end

  • @implementationViewController

  • -(void)downloadImage:(NSString*)url{
  • NSData*data=[[NSDataalloc]initWithContentsOfURL:[NSURLURLWithString:url]];
  • UIImage*image=[[UIImagealloc]initWithData:data];
  • if(image==nil){

  • }else{
  • [selfperformSelectorOnMainThread:@selector(updateUI:)withObject:imagewaitUntilDone:YES];
  • }
  • }

  • -(void)updateUI:(UIImage*)image{
  • self.imageView.image=image;
  • }


  • -(void)viewDidLoad
  • {
  • [superviewDidLoad];

  • //[NSThreaddetachNewThreadSelector:@selector(downloadImage:)toTarget:selfwithObject:kURL];
  • NSThread*thread=[[NSThreadalloc]initWithTarget:selfselector:@selector(downloadImage:)object:kURL];
  • [threadstart];
  • }

  • -(void)didReceiveMemoryWarning
  • {
  • [superdidReceiveMemoryWarning];
  • //Dispo搜索引擎优化fanyresourcesthatcanberecreated.
  • }

  • @end
2.4.2线程间通信

线程下载完图片后怎样关照主线程更新界面呢?
[selfperformSelectorOnMainThread:@selector(updateUI:)withObject:imagewaitUntilDone:YES];
performSelectorOnMainThread是NSObject的办法,除能够更新主线程的数据外,还能够更新其他线程的好比:
用:performSelector:onThread:withObject:waitUntilDone:
运转下载图片:

<br>
图片下载上去了。
2.3线程同步

我们演示一个典范的卖票的例子来说NSThread的线程同步:
.h

  • #import<UIKit/UIKit.h>

  • @classViewController;

  • @interfaceAppDelegate:UIResponder<UIApplicationDelegate>
  • {
  • inttickets;
  • intcount;
  • NSThread*ticketsThreadone;
  • NSThread*ticketsThreadtwo;
  • NSCondition*ticketsCondition;
  • NSLock*theLock;
  • }
  • @property(strong,nonatomic)UIWindow*window;

  • @property(strong,nonatomic)ViewController*viewController;

  • @end

  • -(BOOL)application:(UIApplication*)applicationdidFinishLaunchingWithOptions:(NSDictionary*)launchOptions
  • {

  • tickets=100;
  • count=0;
  • theLock=[[NSLockalloc]init];
  • //锁对象
  • ticketsCondition=[[NSConditionalloc]init];
  • ticketsThreadone=[[NSThreadalloc]initWithTarget:selfselector:@selector(run)object:nil];
  • [ticketsThreadonesetName:@"Thread-1"];
  • [ticketsThreadonestart];


  • ticketsThreadtwo=[[NSThreadalloc]initWithTarget:selfselector:@selector(run)object:nil];
  • [ticketsThreadtwosetName:@"Thread-2"];
  • [ticketsThreadtwostart];

  • self.window=[[UIWindowalloc]initWithFrame:[[UIScreenmainScreen]bounds]];
  • //Overridepointforcustomizationafterapplicationlaunch.
  • self.viewController=[[ViewControlleralloc]initWithNibName:@"ViewController"bundle:nil];
  • self.window.rootViewController=self.viewController;
  • [self.windowmakeKeyAndVisible];
  • returnYES;
  • }

  • -(void)run{
  • while(TRUE){
  • //上锁
  • //[ticketsConditionlock];
  • [theLocklock];
  • if(tickets>=0){
  • [NSThreadsleepForTimeInterval:0.09];
  • count=100-tickets;
  • NSLog(@"以后票数是:%d,售出:%d,线程名:%@",tickets,count,[[NSThreadcurrentThread]name]);
  • tickets--;
  • }else{
  • break;
  • }
  • [theLockunlock];
  • //[ticketsConditionunlock];
  • }
  • }
假如没有线程同步的lock,卖票数多是-1.加上lock以后线程同步包管了数据的准确性。
下面例子我利用了两种锁,一种NSCondition,一种是:NSLock。NSCondition我已正文了。

iPhoneSDK安装,然后最基本的是你要熟悉C语言,再来你得学习开发iPhone所使用的Objective-C语言,接著是Cocoa。如果你是Mac平台开发的入门用户
不帅 该用户已被删除
沙发
发表于 2015-1-21 08:52:56 | 只看该作者
AD: iPhone文件系统NSFileManager讲解是本文要介绍的内容,主要是通过iphone文件系统来学习NSFileManager的使用方法,具体内容来看本文详解。
小妖女 该用户已被删除
板凳
发表于 2015-1-30 12:56:31 | 只看该作者
看《iPhone 4与iPad开发基础教程》,跟着一步步来
因胸联盟 该用户已被删除
地板
发表于 2015-2-2 11:36:29 来自手机 | 只看该作者
其次学习方法和学习心态很重要,在学习当中应该保持一颗良好的心态。应该借鉴别人好的学习方法,大家互相帮助,取长补短。
谁可相欹 该用户已被删除
5#
发表于 2015-2-5 07:25:17 | 只看该作者
以上可以同时进行,学习过程中尽量不要纠结细节和底层,要知道ios是封闭的、OC是高级语言,我们不可能过多地去了解它的原理,至少在新手阶段没有必要。用迭代的方式更新你的知识,而不是死抠一个知识点。
小女巫 该用户已被删除
6#
发表于 2015-2-5 23:05:17 | 只看该作者
看《iPhone 4与iPad开发基础教程》,跟着一步步来
莫相离 该用户已被删除
7#
发表于 2015-2-14 02:15:14 | 只看该作者
近期由于IOS7的发布,所以应用的适配潮可谓是都搞的锣鼓喧天,甚是热闹,因此呢,因适配IOS7而产生的问题也是铺天盖地的卷来,
乐观 该用户已被删除
8#
发表于 2015-2-14 21:07:04 | 只看该作者
其次学习方法和学习心态很重要,在学习当中应该保持一颗良好的心态。应该借鉴别人好的学习方法,大家互相帮助,取长补短。
深爱那片海 该用户已被删除
9#
发表于 2015-2-23 10:10:06 | 只看该作者
AD: iPhone文件系统NSFileManager讲解是本文要介绍的内容,主要是通过iphone文件系统来学习NSFileManager的使用方法,具体内容来看本文详解。
透明 该用户已被删除
10#
发表于 2015-3-2 20:32:03 | 只看该作者
重要的是,放眼全球也的确找不到第二个如苹果iOS平台这样健壮、完整、先进而且为开发者带来真实收益的开发平台来。
兰色精灵 该用户已被删除
11#
发表于 2015-3-3 20:34:23 | 只看该作者
同很多iOS开发者一样,我也是通过培训进入到iOS开发这个行业,开始没有打算培训,只准备自己学习一些计算机编程相关的知识,毕业时找一份编程相关工作(本人是信息与计算科学这个专业,是数学系)。
柔情似水 该用户已被删除
12#
发表于 2015-3-4 01:10:27 | 只看该作者
特别是在校的学生,都存在一个小小的尴尬——虽然学习iOS开发的热情高涨,但由于没有多余的银子购买昂贵的Mac电脑而踟蹰不前。其实,针对初学者,如果想进入iOS开发的天地
山那边是海 该用户已被删除
13#
发表于 2015-3-8 14:32:05 | 只看该作者
每个行业都一样,想要一天学有所成是不可能的,一定要做好努力的准备,做ios不是简单的学会oc语言。不怕多走弯路,就怕不肯动手。
活着的死人 该用户已被删除
14#
发表于 2015-3-16 01:13:18 | 只看该作者
才在自己的Windows电脑上安装配置成功了一个完美的Mac OS X Lion(10.7.4)系统,而且下载了Xcode4.5的最新版本。虽然不能实机调试,但是作为iOS开发学习已经非常完美了。
灵魂腐蚀 该用户已被删除
15#
发表于 2015-3-22 18:12:48 | 只看该作者
还有开发工具是用Xcode,是在Mac系统的,你多摸索一下就可以开发简单的应用了,建议你买一本iphone开发秘籍第二版看看,希望可以帮到你,谢谢。
若天明 该用户已被删除
16#
发表于 2015-3-22 18:12:49 | 只看该作者
要学会通过各种方法将面前的事情变成自己感兴趣的,那专研起来就不会是无聊和折磨了。
变相怪杰 该用户已被删除
17#
发表于 2015-3-22 18:12:49 | 只看该作者
还有开发工具是用Xcode,是在Mac系统的,你多摸索一下就可以开发简单的应用了,建议你买一本iphone开发秘籍第二版看看,希望可以帮到你,谢谢。
若相依 该用户已被删除
18#
发表于 2015-4-3 01:31:11 | 只看该作者
开始的时候甚至想放弃,不过想想自己的未来,只能咬牙坚持,课下就不停的缠着老师。放学就补基础,这些基础的东西没有速成的,只有刻苦努力。我是后来发现的,转变自己的心态,不要读书看资料当成一种痛苦
只想知道 该用户已被删除
19#
发表于 2015-4-3 21:59:16 | 只看该作者
同很多iOS开发者一样,我也是通过培训进入到iOS开发这个行业,开始没有打算培训,只准备自己学习一些计算机编程相关的知识,毕业时找一份编程相关工作(本人是信息与计算科学这个专业,是数学系)。
飘灵儿 该用户已被删除
20#
发表于 2015-4-6 17:49:43 | 只看该作者
最后在做项目的时候一定要认真对待,毕竟这个直接和你的就业挂钩,这也是锻炼你实际操作的能力。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|仓酷云 鄂ICP备14007578号-2

GMT+8, 2024-4-29 19:44

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表