- 浏览: 27298 次
- 性别:
- 来自: 韶关
最近访客 更多访客>>
文章分类
- 全部博客 (35)
- Hibernate (1)
- java (1)
- Algorithm (2)
- Project Euler (4)
- struts2 (1)
- Java Web (3)
- Design Patterns (0)
- Data Base (1)
- JavaScript (0)
- EveryDay (0)
- Spring (0)
- project (1)
- doc (0)
- ios (13)
- ios小伎俩 (2)
- Body Sensor (1)
- CPP (0)
- sencha touch (0)
- Reading Notes (0)
- Keyword (1)
- UNIX (1)
- Memo (1)
- Project Management (1)
- Work Log (1)
- NodeJs (1)
- Mac OS (1)
- Web (0)
- Computer Vision (0)
最新评论
在app store中的很多应用程序非常的笨重,他们有好的界面,但操作性很差,比如说当程序从网上或本地载入数据的时候,界面被冻结了,用户只能等程序完全载入数据之后才能进行操作。
当打开一个应用程序时,iphone会产生一个包含main方法的线程,所用程序中的界面都是运行在这个线程之中的(table views, tab bars, alerts…),有时候我们会用数据填充这些view,现在问 题是如何有效的载入数据,并且用户还能自如的操作程序。方法是启动新的线程,专门用于数据的下载,而主线程不会因为下载数据被阻塞。
不管使用任何编程语言,在实现多线程时都是一件很麻烦的事情。更糟糕的是,一旦出错,这种错误通常相当糟糕。然而,幸运的是apple从os x10.5在这方面做了很多的改进,NSThread的引入,使得开发多线程应用程序容易多了。除此之外,它们还引入了两个全新的类,NSOperation和NSOperationQueue。
接下来我们通过一个实例来剖析如何使用这两个类实现多线程。这里指示展示这两个类的基本用法,当然这不是使用他们的唯一办法。
如果你熟悉java或者它的别的变种语言的话 ,你会发现NSOperation对象很像java.lang.Runnable接口,就像java.lang.Runnable接口那样,NSOperation类也被设计为可扩展的,而且只有一个需要重写的方法。它就是-(void)main。使用NSOperation的最简单的方式就是把一个NSOperation对象加入到NSOperationQueue队列中,一旦这个对象被加入到队列,队列就开始处理这个对象,直到这个对象的所有操作完成。然后它被队列释放。
下面的例子中,使用一个获取网页,并对其解析程NSXMLDocument,最后将解析得到的NSXMLDocument返回给主线程。
PageLoadOperation.h@interface PageLoadOperation : NSOperation {
NSURL *targetURL;}
@property(retain) NSURL *targetURL;
- (id)initWithURL:(NSURL*)url;@end
PageLoadOperation.m
#import "PageLoadOperation.h"#import "AppDelegate.h"@implementation PageLoadOperation@synthesize targetURL;- (id)initWithURL:(NSURL*)url;{
if (![super init]) return nil;
[self setTargetURL:url];
return self;}- (void)dealloc {
[targetURL release], targetURL = nil;
[super dealloc];
}
- (void)main
{
NSString *webpageString = [[[NSString alloc]
initWithContentsOfURL:[self targetURL]] autorelease];
NSError *error = nil;
NSXMLDocument *document = [[NSXMLDocument alloc]
initWithXMLString:webpageString
options:NSXMLDocumentTidyHTML error:&error];
if (!document) {
NSLog(@"%s Error loading document (%@): %@",
_cmd, [[self targetURL] absoluteString], error);
return;
}
[[AppDelegate shared]
performSelectorOnMainThread:@selector(pageLoaded:)
withObject:document waitUntilDone:YES];
[document release];
}
@end
正如我们所看到的那样,这个类相当的简单,在它的init方法中接受一个url并保存起来,当main函数被调用的时候,它使用这个保存的url创建一个字符串,并将这个字符串传递给NSXMLDocumentinit方法。如果加载的xml数据没有出错,数据会被传递给AppDelegate,它处于主线程中。到此,这个线程的任务就完成了。在主线程中注销操作队列的时候,会将这个NSOperation对象释放。
AppDelegate.h
@interface AppDelegate : NSObject {
NSOperationQueue *queue;
}+ (id)shared;- (void)pageLoaded:(NSXMLDocument*)document;@endAppDelegate.m #import "AppDelegate.h"#import "PageLoadOperation.h"@implementation AppDelegate
static AppDelegate *shared;
static NSArray *urlArray;
- (id)init
{
if (shared)
{
[self autorelease];
return shared;
}
if (![super init]) return nil; NSMutableArray *array = [[NSMutableArray alloc] init];[array addObject:@"http://www.google.com"];[array addObject:@"http://www.apple.com"];[array addObject:@"http://www.yahoo.com"];[array addObject:@"http://www.zarrastudios.com"];[array addObject:@"http://www.macosxhints.com"];urlArray = array; queue = [[NSOperationQueue alloc] init];shared = self;return self;
}
• (void)applicationDidFinishLaunching:
(NSNotification *)aNotification
{
for (NSString *urlString in urlArray)
{
NSURL *url =
[NSURL URLWithString:urlString]; PageLoadOperation *plo =
[[PageLoadOperation alloc] initWithURL:url];
[queue addOperation:plo];
[plo release];
}
}
- (void)dealloc
{
[queue release], queue = nil;
[super dealloc];
}
+ (id)shared;
{
if (!shared) {
[[AppDelegate alloc] init];
}
return shared;
}
- (void)pageLoaded:(NSXMLDocument*)document;
{
NSLog(@"%s Do something with the XMLDocument: %@",
_cmd, document);
}
@end
NSOperationQueue的并行控制(NSOperationQueue Concurrency)
在上面这个简单的例子中,我们很难看出这些操作是并行运行的,然而,如果你你的操作花费的时间远远比这里的要长,你将会发现,队列是同时执行这些操作的。幸运的是,如果你想要为队列限制同时只能运行几个操作,你可以使用NSOperationQueue的setMaxConcurrentOperationCount:方法。例如,[queue setMaxConcurrentOperationCount:2];
发表评论
-
What's new in iOS5
2011-10-11 21:07 945Accounts When creating an i ... -
The table of contents in Xcode4
2011-07-08 17:26 828Terminal输入: sudo egrep -lRZ ... -
How to add static library file
2011-07-01 17:55 8001、以xcode的静态库文件模板创建静态库文件; 2、注意类 ... -
iPhone 处理大文件(MD5)
2011-06-13 14:22 1245+(NSString*)fileMD5:(NSStrin ... -
Using Video
2011-04-26 10:59 0记录和编辑视频 从IOS 3.0开始就可以在提供了 ... -
Core Animation
2011-04-23 03:31 629大纲: 什么是Core Animation? 几何 ... -
UIView
2011-04-23 03:08 0p.p1 {margin: 0.0px 0.0px ... -
View Programming
2011-04-21 02:50 3921、用UIKit做简单动画,用core animation做更 ... -
各种函数
2011-04-21 01:03 6321、保存图片到相册(有camera roll保存到camera ... -
关于IOS中的DataSource(数据源)
2011-01-02 15:34 1436数据源是应用程序的模型、视图、还是控制器部分?数据源好像应该是 ... -
ios小记
2010-12-29 14:50 752遵守NSCopying协议的类的实例才能发送copy消息,当 ... -
UIPopoverController的presentPopoverViewWithRect:inView
2010-12-29 12:41 639UIPopoverController中的prese ... -
学习C
2010-12-22 13:33 0C作为一门历史悠久的编 ... -
SwitchView相關概念
2010-12-14 09:48 01、每个视图控制器(包括多视图控制器)都控制一个内容视图,应用 ... -
纸上谈兵-iPhone
2010-12-04 21:46 01、[[NSString alloc] initWithFor ... -
iphone開發中的內存分配
2010-12-02 16:54 9061、內存分配、釋放成對出現 2、注意copy,reta ... -
關於delegate
2010-12-01 14:22 1144UIApplication接收事件,UIApplicat ...
相关推荐
ls_dyna,四种螺栓预紧的方式
最简单的线刷方式sideload
org.eclipse.swt.SWTError: No more handles [MOZILLA_FIVE_HOME=''] (java.lang.UnsatisfiedLinkError: Could not load SWT library. Reasons: no swt-mozilla-gtk-4335 in java.library.path no swt-mozilla-gtk ...
>>> from pre_commit.clientlib import load_config >>> from pre_commit_ci_config import SCHEMA >>> cfg = load_config( ' .pre-commit-config.yaml ' ) >>> cfg = cfgv.validate(cfg, SCHEMA ) >>> cfg = cfgv....
自己收集的sqlload 资料,很全~~~~~~~~~~~~~~~~~
1.0.32版本的adb,
Please pre-load the data into a buffer like io.BytesIO and try to load from it instead. 我们一步一步分析。 模型网络权重保存额代码是:torch.save(net.state_dict(),’net.pkl’) (1)查看获取模型权重的...
解决org.eclipse.swt.SWTError: No more handles [MOZILLA_FIVE_HOME=''] (java.lang.UnsatisfiedLinkError: Could not load SWT library. Reasons: no swt-mozilla-gtk-4335 in java.library.path
PYTHON首先要安装scapy模块 PY3的安装scapy-python3,使用PIP...<pre name=code class=python>packet=pcaps[0] #第1个数据包结构 packet.time#数据包时间戳 packet[Raw].load#PY3读取节点数据方法,packet[IP].src;pac
代码检查
解决 Error:Android Pre Dex: [dx.jar] Failed to load dx.jar 问题
/** * 自动刷新 * @type {*|jQuery|HTMLElement} */ var $container = $('#main'); $container.imagesLoaded( function(){ $container.masonry({ itemSelector : '.item', columnWidth:205, ...var pre_href;
1、image.load_img() from keras.preprocessing import image img_keras = image.load_img('./original/dog/880.jpg') print(img_keras) img_keras = image.img_to_array(img_keras) print(img_keras[:,1,1]) 效果...
学计算机,多看英文版原著对自身有帮助的,本教程为全英文.
RELEASE NOTES: README.txt,v 1.5 2003/02/22 06:21:57 russcoon Exp $_______________________________________________________________________________0.3.0 pre2OVERVIEW: ...structuring of inline constructor ...
【SpringBoot】Error: Could not find or load main class org.apache.hadoop.mapreduce.v2.app.MRAppMaster报错明细问题解决后记 报错明细 IDEA SpringBoot集成hadoop运行环境,,本地启动项目,GET请求接口触发...
一维稳态静态包络和超爱丁顿风在光球半径扩展(PRE)I型X射线爆裂中。 使用GR和通量限制扩散。 参见Guichandut等。 (2021)供参考。 问题-> 依赖关系:python v> 3.6,numpy,scipy。现有型号IO.py包含用于读取和...
文章评论和侧栏评论的头像和表情增加lazyload显示 当需要的的时候才会请求加载图片 尤其对文章页面评论较多的情况; 列表页面Ajax load 当滚动接近尾部时会自动在当前页面加载下一页的内容 可在后台D8主题设置里开启...
Differential analog microphone inputs with boost pre-amplifiers and low noise microph +20/+24/+30/+35/+40/+44/+50/+52 dB microphone boost gain MIC input to ADC with 50dB boost gain, SNR > 66...
load pre.txt %原始数据以列向量的方式存放在纯文本文件中 yt=pre; n=length(yt); alpha=0.3; st1(1)=yt(1); st2(1)=yt(1); for i=2:n st1(i)=alpha*yt(i)+(1-alpha)*st1(i-1); st2(i)=alpha*st1(i)+(1-alpha)...