- 浏览: 258772 次
- 性别:
- 来自: 深圳
最新评论
-
whizkid:
[img] private void enableNdefEx ...
android通过NFC读写数据 -
zhangminglife:
您好!不错,最近正在弄这个东西,能否把demo发给我一份谢谢了 ...
SSL双向认证java实现(转) -
water卡:
android如何调用显示和隐藏系统默认的输入法 -
water卡:
android如何调用显示和隐藏系统默认的输入法 -
sjp524617477:
good
生成android使用的BKS证书
解析iphone多线程
2011-06-02 17:27 佚名 互联网 我要评论(0) 字号:T | T
这篇文章主要从线程创建与启动、线程的同步与锁、线程的交互、线程池等等四个方面简单的讲解一下iphone中的多线程编程。
AD:
不管是iphone中还是其他的操作系统,多线程在各种编程语言中都是难点,很多语言中实现起来很麻烦,objective-c虽然源于c,但其多线程编程却相当简单,可以与java相媲美。多线程编程是防止主线程堵塞,增加运行效率等等的最佳方法。而原始的多线程方法存在很多的毛病,包括线程锁死等。
一、线程创建与启动
线程创建主要有二种方式:
(id)init; // designated initializer
(id)initWithTarget:(id)target selector:
(SEL)selector object:(id)argument;
当然,还有一种比较特殊,就是使用所谓的convenient method,这个方法可以直接生成一个线程并启动它,而且无需为线程的清理负责。这个方法的接口是:
(void)detachNewThreadSelector:
(SEL)aSelector toTarget:
(id)aTarget withObject:
(id)anArgument
前两种方法创建后,需要手机启动,启动的方法是:
(void)start;
二、线程的同步与锁
要说明线程的同步与锁,最好的例子可能就是多个窗口同时售票的售票系统了。我们知道在java中,使用synchronized来同步,而iphone虽然没有提供类似java下的synchronized关键字,但提供了NSCondition对象接口。查看NSCondition的接口说明可以看出,NSCondition是iphone下的锁对象,所以我们可以使用NSCondition实现iphone中的线程安全。这是来源于网上的一个例子:
SellTicketsAppDelegate.h 文件
// SellTicketsAppDelegate.h
import <UIKit/UIKit.h>
@interface SellTicketsAppDelegate : NSObject <UIApplicationDelegate> {
int tickets;
int count;
NSThread* ticketsThreadone;
NSThread* ticketsThreadtwo;
NSCondition* ticketsCondition;
UIWindow *window;
}
@property (nonatomic, retain) IBOutlet UIWindow *window;
@end
SellTicketsAppDelegate.m 文件
// SellTicketsAppDelegate.m
import "SellTicketsAppDelegate.h"
@implementation SellTicketsAppDelegate
@synthesize window;
- (void)applicationDidFinishLaunching:(UIApplication *)application {
tickets = 100;
count = 0;
// 锁对象
ticketCondition = [[NSCondition alloc] init];
ticketsThreadone = [[NSThread alloc] initWithTarget:self selector:@selector(run) object:nil];
[ticketsThreadone setName:@"Thread-1"];
[ticketsThreadone start];
ticketsThreadtwo = [[NSThread alloc] initWithTarget:self selector:@selector(run) object:nil];
[ticketsThreadtwo setName:@"Thread-2"];
[ticketsThreadtwo start];
//[NSThread detachNewThreadSelector:@selector(run) toTarget:self withObject:nil];
// Override point for customization after application launch
[window makeKeyAndVisible];
}
- (void)run{
while (TRUE) {
// 上锁
[ticketsCondition lock];
if(tickets > 0){
[NSThread sleepForTimeInterval:0.5];
count = 100 - tickets;
NSLog(@"当前票数是:%d,售出:%d,线程名:%@",tickets,count,[[NSThread currentThread] name]);
tickets--;
}else{
break;
}
[ticketsCondition unlock];
}
}
- (void)dealloc {
[ticketsThreadone release];
[ticketsThreadtwo release];
[ticketsCondition release];
[window release];
[super dealloc];
}
@end
三、线程的交互
线程在运行过程中,可能需要与其它线程进行通信,如在主线程中修改界面等等,可以使用如下接口:
(void)performSelectorOnMainThread:
(SEL)aSelector withObject:
(id)arg waitUntilDone:
(BOOL)wait
由于在本过程中,可能需要释放一些资源,则需要使用NSAutoreleasePool来进行管理,如:
(void)startTheBackgroundJob {
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
// to do something in your thread job
...
[self performSelectorOnMainThread:@selector(makeMyProgressBarMoving) withObject:nil waitUntilDone:NO];
[pool release];
}
小结:
对于多线程,在一个程序中,一些独立运行的程序片断叫作线程,利用它编程的概念就叫作多线程处理。多线程处理一个常见的例子就是用户界面。利用线程,用户可按下一个按钮,然后程序会立即作出响应,而不是让用户等待程序完成了当前任务以后才开始响应
2011-06-02 17:27 佚名 互联网 我要评论(0) 字号:T | T
这篇文章主要从线程创建与启动、线程的同步与锁、线程的交互、线程池等等四个方面简单的讲解一下iphone中的多线程编程。
AD:
不管是iphone中还是其他的操作系统,多线程在各种编程语言中都是难点,很多语言中实现起来很麻烦,objective-c虽然源于c,但其多线程编程却相当简单,可以与java相媲美。多线程编程是防止主线程堵塞,增加运行效率等等的最佳方法。而原始的多线程方法存在很多的毛病,包括线程锁死等。
一、线程创建与启动
线程创建主要有二种方式:
(id)init; // designated initializer
(id)initWithTarget:(id)target selector:
(SEL)selector object:(id)argument;
当然,还有一种比较特殊,就是使用所谓的convenient method,这个方法可以直接生成一个线程并启动它,而且无需为线程的清理负责。这个方法的接口是:
(void)detachNewThreadSelector:
(SEL)aSelector toTarget:
(id)aTarget withObject:
(id)anArgument
前两种方法创建后,需要手机启动,启动的方法是:
(void)start;
二、线程的同步与锁
要说明线程的同步与锁,最好的例子可能就是多个窗口同时售票的售票系统了。我们知道在java中,使用synchronized来同步,而iphone虽然没有提供类似java下的synchronized关键字,但提供了NSCondition对象接口。查看NSCondition的接口说明可以看出,NSCondition是iphone下的锁对象,所以我们可以使用NSCondition实现iphone中的线程安全。这是来源于网上的一个例子:
SellTicketsAppDelegate.h 文件
// SellTicketsAppDelegate.h
import <UIKit/UIKit.h>
@interface SellTicketsAppDelegate : NSObject <UIApplicationDelegate> {
int tickets;
int count;
NSThread* ticketsThreadone;
NSThread* ticketsThreadtwo;
NSCondition* ticketsCondition;
UIWindow *window;
}
@property (nonatomic, retain) IBOutlet UIWindow *window;
@end
SellTicketsAppDelegate.m 文件
// SellTicketsAppDelegate.m
import "SellTicketsAppDelegate.h"
@implementation SellTicketsAppDelegate
@synthesize window;
- (void)applicationDidFinishLaunching:(UIApplication *)application {
tickets = 100;
count = 0;
// 锁对象
ticketCondition = [[NSCondition alloc] init];
ticketsThreadone = [[NSThread alloc] initWithTarget:self selector:@selector(run) object:nil];
[ticketsThreadone setName:@"Thread-1"];
[ticketsThreadone start];
ticketsThreadtwo = [[NSThread alloc] initWithTarget:self selector:@selector(run) object:nil];
[ticketsThreadtwo setName:@"Thread-2"];
[ticketsThreadtwo start];
//[NSThread detachNewThreadSelector:@selector(run) toTarget:self withObject:nil];
// Override point for customization after application launch
[window makeKeyAndVisible];
}
- (void)run{
while (TRUE) {
// 上锁
[ticketsCondition lock];
if(tickets > 0){
[NSThread sleepForTimeInterval:0.5];
count = 100 - tickets;
NSLog(@"当前票数是:%d,售出:%d,线程名:%@",tickets,count,[[NSThread currentThread] name]);
tickets--;
}else{
break;
}
[ticketsCondition unlock];
}
}
- (void)dealloc {
[ticketsThreadone release];
[ticketsThreadtwo release];
[ticketsCondition release];
[window release];
[super dealloc];
}
@end
三、线程的交互
线程在运行过程中,可能需要与其它线程进行通信,如在主线程中修改界面等等,可以使用如下接口:
(void)performSelectorOnMainThread:
(SEL)aSelector withObject:
(id)arg waitUntilDone:
(BOOL)wait
由于在本过程中,可能需要释放一些资源,则需要使用NSAutoreleasePool来进行管理,如:
(void)startTheBackgroundJob {
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
// to do something in your thread job
...
[self performSelectorOnMainThread:@selector(makeMyProgressBarMoving) withObject:nil waitUntilDone:NO];
[pool release];
}
小结:
对于多线程,在一个程序中,一些独立运行的程序片断叫作线程,利用它编程的概念就叫作多线程处理。多线程处理一个常见的例子就是用户界面。利用线程,用户可按下一个按钮,然后程序会立即作出响应,而不是让用户等待程序完成了当前任务以后才开始响应
发表评论
-
iPhone开发关于UDID和UUID的一些理解
2013-03-20 15:39 1139一.UDID(Unique Device Identifi ... -
卸载xcode4.2
2012-11-20 22:59 936卸载xcode4.2 Terminal: sudo < ... -
XCode 4.2支持iOS 5.1.1真机调试的实现 .
2012-11-20 22:25 1477目前市面上的ios设备,操作系统都是5.1.1的版本了。但是偶 ... -
Objective-C实现信用卡校验
2012-07-09 11:00 1003Objective-C实现信用卡校验(Luhn algorit ... -
object-c:property,assign,copy,retain,release区别
2012-06-01 17:03 1092例子: @property(nonatomic,retain) ... -
mac终端命令大全
2012-05-25 17:17 1546可以在终端里用 rm -rf ... -
xcode 编译静态库
2012-05-25 16:53 1409这里以libcurl 为例: 1.首先需要下载 ... -
IOS中设置使用GDataXML解析类库
2012-05-24 18:01 2021如何在项目中设置使用GDataXML解析类库 1. 从http ... -
ios框架
2012-05-21 16:02 11251.ASIHTTPRequest 大名鼎鼎的asi很多人应该 ... -
UISearchBar and UITableView搜索例子
2011-09-20 23:36 1790UISearchBar and UITableView是我们很 ... -
iphone里读取gb2312(中文)编码文件或者二进制流。
2011-09-06 17:37 1551说到文字编码,与文件读写打过交道的软件开发人员应该都知道,比如 ... -
IPhone短信相关部分研究(转载)
2011-09-06 10:06 1508短信发送和截获 方式一: 打 开/dev/tty.debu ... -
iOS4.0程序内发短信
2011-09-06 10:05 1302OS4.0新加入了MFMessageComposeViewCo ... -
Xcode4 SVN配置
2011-09-01 17:17 1079Xcode SVN配置 编辑 ~/.subversion/co ... -
stretchableImageWithLeftCapWidth:topCapHeight:函数用法 总结
2011-08-09 16:25 2175stretchableImageWithLeftCapWidt ... -
iPhone开发中的问题整理(一)
2011-08-08 23:16 1074看到很刚开始开发iPhone软件的朋友问很多问题,其实同样的问 ... -
iPhone多线程编程初体验
2011-08-08 22:24 1069iPhone多线程编程初体验 2011-06-07 17:35 ... -
iphone多线程的使用
2011-08-08 22:15 932以下是开发初期收集整 ... -
多线程之NSInvocationOperation
2011-08-08 22:09 655多线程编程是防止主线程堵塞,增加运行效率等等的最佳方法。而原始 ... -
iPhone上的JSON
2011-08-08 22:04 910JSON我就不多解释了,需要更多信息的朋友请到json.org ...
相关推荐
### iPhone多线程编程指南知识点解析 #### 一、多线程编程概述 **1.1 什么是多线程** 多线程是指在一个程序中同时运行多个代码路径的能力。这使得程序可以在执行某些任务的同时处理其他任务,从而提高程序的整体...
本文将深入探讨在iPhone开发中使用Object-C实现多线程的相关知识点。 一、多线程基础 1. 主线程:主线程是应用的入口,负责处理UI更新和用户交互。为了保证界面的流畅,所有的UI操作应该在主线程上进行。 2. 工作...
本文将深入探讨如何在iPhone开发中利用多线程进行网络请求和图片下载。 首先,我们来看一下标题中的“多线程网络请求”。在iOS中,网络请求通常采用URLSession进行,它提供了异步处理能力,可以在后台线程中执行,...
6. **GCD (Grand Central Dispatch)**: 为了提高性能和用户体验,可能将XML解析放在后台线程进行,利用GCD异步处理任务,避免阻塞主线程。 7. **网络请求**:如果XML数据是从服务器获取的,那么可能使用URLSession...
综上所述,这个"show-view.zip_DEMO_iphone xml"实例涵盖了XML解析、多线程和页面旋转三大知识点。通过学习和研究这个DEMO,开发者可以深化对这些技术的理解,提升在iOS平台上构建高效、响应迅速的应用的能力。同时...
3. **多线程下载**:为了提高下载效率,工具可能支持多线程下载,使得大文件的下载速度得到显著提升。 4. **免费使用**:根据提供的标签信息,这款工具是免费提供的,用户无需支付任何费用就能使用其服务,对于经常...
- **多线程与后台任务**:教授如何实现多线程编程,处理后台任务,如下载、上传等,同时保持应用的响应性。 - **多媒体应用开发**:涵盖如何使用AVFoundation框架进行音频和视频的播放与录制,以及如何处理图像和...
《深入解析iPhone QQ协议源码》 iPhone QQ协议源码是许多iOS开发者梦寐以求的技术资源,尤其对于那些热衷于即时通讯应用开发的程序员来说,它的重要性不言而喻。QQ作为中国最大的社交平台之一,其在移动设备上的...
6. **多线程与性能优化**:iOS开发中,多线程管理和性能优化是提高用户体验的关键,本书会介绍Grand Central Dispatch(GCD)、Operation和Queue,以及内存管理技巧。 7. **动画与图形处理**:利用Core Animation和...
这本书旨在帮助开发者提升在iPhone平台上的应用开发技能,涵盖了从基础到高级的各种主题,包括界面设计、性能优化、网络编程、多线程以及游戏开发等关键知识点。 1. **iPhone SDK 3概述**:iPhone SDK 3是苹果为...
3. **多线程**:为了保证用户体验,源码会利用GCD(Grand Central Dispatch)或者NSOperationQueue来实现异步网络请求,避免UI阻塞。 4. **推送通知**:iPhoneQQ可能会集成苹果的PushKit或UserNotifications框架,...
- **Grand Central Dispatch (GCD)**:用于执行异步任务和管理多线程的框架,提高应用的响应性和效率。 - **Operation Queues**:另一种处理异步任务的方式,提供更高级别的抽象和控制。 #### 7. **测试与调试** ...
最后阶段会介绍一些高级主题,如多线程、闭包、GCD(Grand Central Dispatch)以及单元测试。完成应用程序后,你将学习如何进行真机测试、App Store Connect的设置,以及提交你的第一个App到App Store进行审核和发布...
2. **适配iOS**:由于是针对iPhone,源码可能涉及到对iOS系统的特定优化,比如利用多线程技术处理后台任务,避免阻塞主线程导致界面卡顿,或者使用iOS的特定API进行硬件加速。 3. **错误修复**:源码可能包含了对...
6. **多线程**:由于网络操作通常在后台线程执行,我们需要确保UI更新是安全的。可以使用`dispatch_async`(Objective-C)或`DispatchQueue.main.async`(Swift)来在主线程上更新界面。 7. **错误处理**:处理可能...
通过分析《易语言iPhone+QQ在线》的源码,开发者可以深入学习到易语言与其他技术的结合,如iOS接口集成、网络通信、多线程编程等。同时,这也是一次了解如何利用易语言实现跨平台应用开发的实践机会。对于希望提升跨...
4. **支持多线程应用程序**:多线程技术意味着程序可以同时处理多个任务,提高效率。在这种情况下,可能指的是在读取或解析多个条码时,程序不会出现卡顿或延迟,确保了高效的数据处理能力。 结合“条形码PC端”的...
- **多线程编程**:深入探讨Grand Central Dispatch(GCD)和NSOperationQueue的使用,实现高效的并发编程。 ### 结论 《iPhone开发秘籍(The iPhone Developer Cookbook)(第2版)(英文版)》是一本内容丰富、覆盖广泛...