昨天在项目中使用到了以前所没有使用过的线程,今天有时间来简单的学习一下。

一.线程的创建分为三种方法

  1. (id)init; // designated initializer
  2. (id)initWithTarget:(id)target selector: (SEL)selector object:(id)argument;

以上两种方法创建的线程方法,需要另外调用 “start”方法来启动该线程

  3.(void)detachNewThreadSelector:  (SEL)aSelector toTarget:  (id)aTarget withObject:  (id)anArgument

而上面这种创建线程的方法,则不需要再额外调用其他方法来启动线程。

  4. [selfperformSelectorInBackground:@selector(threadAction) withObject:self];

  也不用调用启动方法。更多的使用县城方法,倾向于使用这种方式。

  5.NSOperationQueue *operationQueue = [[NSOperationQueuealloc]init];

[operationQueue addOperationWithBlock:^{

for (int i = 0; i < 30; i++) {

NSLog(@"多线程:%d",i);

}

}];

  6.

//1.线程池:这个对象可设置线程执行优先级和线程并发数(同时段执行多少线程)

NSOperationQueue *operationQueue = [[NSOperationQueuealloc]init];

[operationQueue addOperationWithBlock:^{

for (int i = 0; i < 30; i++) {

NSLog(@"多线程:%d",i);

}

}];

//设置并发数为1,线程池中同一时间只能执行一个线程

operationQueue.maxConcurrentOperationCount = 1;

NSInvocationOperation *operation1 = [[NSInvocationOperationalloc] initWithTarget:selfselector:@selector(operationAction1) object:nil];

//设置线程的优先级

[operation1 setQueuePriority:NSOperationQueuePriorityLow];

NSInvocationOperation *operation2 = [[NSInvocationOperationalloc] initWithTarget:selfselector:@selector(operationAction1) object:nil];

[operation2 setQueuePriority:NSOperationQueuePriorityHigh];

//把线程添加进线程池中去

[operationQueue addOperation:operation1];

[operationQueue addOperation:operation2];

二:1。暂时遇到一个说法,更新UI必须得回到主线程。

暂时我不清楚这样的原因,并且什么情况,或者说怎么使用线程方法才是回到主线程,对于我来说还是一个迷。

  2。清楚的是,调用以下这个方法是回到主线程。(下面这个方法,也在很多情况下被用到,以此来回到主线程来更新UI)

用NSObject的类方法  performSelectorInBackground:withObject: 创建一个线程:
[Obj performSelectorInBackground:@selector(doSomething) withObject:nil];

三:下面这一段代码或许就是对问题二得一个合理得解释。利用一中得三类方法开得线程都不是主线程,所以在下面代码中,新开得线程方法里下载完图片之后,需要返回到主线程来更新UI。

//
// ViewController.m
// NSThreadDemo
//
// Created by rongfzh on 12-9-23.
// Copyright (c) 2012年 rongfzh. All rights reserved.
//

#import "ViewController.h"
#define kURL @"http://avatar.csdn.net/2/C/D/1_totogo2010.jpg"
@interface ViewController ()

@end

@implementation ViewController

-(void)downloadImage:(NSString *) url{
NSData *data = [[NSData alloc] initWithContentsOfURL:[NSURL URLWithString:url]];
UIImage *image = [[UIImage alloc]initWithData:data];
if(image == nil){

}else{
[self performSelectorOnMainThread:@selector(updateUI:) withObject:image waitUntilDone:YES];
}
}

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

- (void)viewDidLoad
{
[super viewDidLoad];

// [NSThread detachNewThreadSelector:@selector(downloadImage:) toTarget:self withObject:kURL];
NSThread *thread = [[NSThread alloc]initWithTarget:self selector:@selector(downloadImage:) object:kURL];
[thread start];
}

- (void)didReceiveMemoryWarning
{
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}

@end

iOS线程的更多相关文章

  1. IOS 线程处理 子线程

    IOS 线程处理 子线程的启动与结束 技术交流新QQ群:414971585   IOS中,如果要在主线程中启动一个子线程,可以又两种方法: [NSThread detachNewThreadSelec ...

  2. iOS线程之——NSCondition

    多线程在各种编程语言中都是难点,很多语言中实现起来很麻烦,objective-c虽然源于c,但其多线程编程却相当简单,可以与java相媲美.这篇文章主要从线程创建与启动.线程的同步与锁.线程的交互.线 ...

  3. iOS 线程操作库 PromiseKit

    iOS 线程操作库 PromiseKit 官网:http://promisekit.org/ github:https://github.com/mxcl/PromiseKit/tree/master ...

  4. ios线程和GCD

    1.什么是进程? 进程是指在系统中正在运行的一个应用程序.比如同时打开QQ.Xcode,系统就会分别启动2个进程.截图 2.什么是线程? 1).一个进程要想执行任务,必须得有线程(每一个进程至少要有一 ...

  5. iOS - 线程管理

    iOS开发多线程篇—GCD的常见用法 一.延迟执行 1.介绍 iOS常见的延时执行有2种方式 (1)调用NSObject的方法 [self performSelector:@selector(run) ...

  6. IOS线程的一些总结

    主线程的作用 (在主线程中才能设置) 显示/刷新UI界面 处理UI事件(比如点击事件.滚动事件.拖拽事件): 主线程的使用注意 别将比较耗时的操作放到主线程中. 耗时操作会卡住主线程.影响体验. [N ...

  7. iOS 线程锁同步机制

    转载自 http://yulingtianxia.com/blog/2015/11/01/More-than-you-want-to-know-about-synchronized/ 如果你已经使用 ...

  8. IOS线程操作(3)

    采用CGD更有效的比前两个(它被认为是如此,有兴趣的同学可以去试试). 这是推荐的方式来使用苹果的比较. GCD它是Grand Central Dispatch缩写,这是一组并行编程C介面. GCD是 ...

  9. ios线程和GCD和队列同步异步的关系

    1.什么是进程? 进程是指在系统中正在运行的一个应用程序.比如同时打开QQ.Xcode,系统就会分别启动2个进程.截图 2.什么是线程? 1).一个进程要想执行任务,必须得有线程(每一个进程至少要有一 ...

  10. iOS 线程安全--锁

    一,前言 线程安全是iOS开发中避免了的话题,随着多线程的使用,对于资源的竞争以及数据的操作都可能存在风险,所以有必要在操作时保证线程安全. 二,为什么要使用锁? 由于一个进程中不可避免的存在多线程, ...

随机推荐

  1. 国内外做MySQL的公司

    MariaDB 基金会   Percona企业级服务   vividx      监控       webyog   监控和管理   springboksql   mysql 一体机      htt ...

  2. as的Enter_Frame与Timer

    As3中的Timer和Event.EnterFrame是有明显的区别的. Evnet.EnterFrame是定时间隔多少时间出发.如果执行时间比间隔时间长,则会间隔执行时间这么久. 举个例子: Fla ...

  3. Jquery如何获得<iframe>嵌套页面中的元素

    DOM方法:父窗口操作IFRAME:window.frames["iframeSon"].documentIFRAME操作父窗口: window.parent.documentjq ...

  4. Echart 商业级数据图表

    简介 最近工作上用到这个图表库,图表丰富,用起来也很方便.纯javascript,可以流畅得运行在PC和移动设备上,兼容大部分浏览器. 支持折线图(区域图).柱状图(条状图).散点图(气泡图).K线图 ...

  5. css选择符有哪些?哪些属性可以继承?优先级算法如何计算?内联和important哪个优先

    通配选择符* { sRules }  类型选择符E { sRules }  td { font-size:14px; width:120px; }   属性选择符 E [ attr ] { sRule ...

  6. 20145218 《Java程序设计》第五周学习总结

    20145218 <Java程序设计>第五周学习总结 教材学习内容总结 异常 程序中总有些意想不到的状况所引发的错误,如果不对异常进行正确的处理,则可能导致程序的中断执行,造成不必要的损失 ...

  7. Sql Server聚集索引创建

    create CLUSTERED index IX_ZhuiZIDList_ZID on ZhuiZIDList (ZID)

  8. Qt之保持GUI响应

    简述 Qter们经常遇到由于耗时操作造成GUI阻塞的问题.其实,这个问题并不难克服,可以采用许多不同的方式,下面我会列举一些可选范围,根据使用情况进行处理. 简述 执行耗时操作 手动事件处理 使用一个 ...

  9. WPF:linq

    /// <summary> /// 该药品是否存在发药信息 /// 存在返回true,否则返回false /// </summary> /// <param name=& ...

  10. python中2进制、10进制、16进制等之间的转换

    10转2: bin(8) # '0b1000' 2转10: int( 10转16: hex(15) # '0xf' 16转10: int( 2进制和16进制中间通过转10进制可以相互转换 from b ...