iphone开发多线程

摘要:
通过userInfor//将所需数据传递给线程。在这里,线程结束后立即返回[self-performSelectorOnMainThread:@selectorwithObject:nilwaitUntilDone:NO];[池发布];}PerformSelectorOnMainThread通知主线程执行函数endThread。您还可以使用performSelecter:onThread:withObject:waitUntil通知线程在线程结束后执行处理。如果需要刷新接口,请调用主线程中的方法,通过performSelectorOnMainThread进行刷新。终于找到了这个组织。例如,启动一个线程以下载image://Start线程[NSThreaddetachNewThreadSelector:@selectortoTarget:selftwithObject:url]//线程函数//NSURL类的用途是什么?

 

举例说明怎么简单的创建一个子线程。

用到的类是NSThread类,这里使用detachNewTheadSelector:toTagaet:withObject创建一个线程。

函数setupThread:(NSArray*)userInfor。通过userInfor将需要的数据传到线程中。

函数定义:

-(void)setupThread:(NSArray*)userInfor{

   [NSThread detachNewThreadSelector:@selector(threadFunc:) toTarget:self withObject:(id)userInfor];   

//这个函数就和pthread_create函数一样了,不过在有xib交互时不能直接使用pthread_create函数,因为pthread_create调用一个c函数(相当于这个selector),c函数里面不能调用xib的控件,这就是我遇到的问题,可能会有别的解决办法。

}

- (void)threadFunc:(id)userInfor{

   NSAutoreleasePool*pool = [[NSAutoreleasePool alloc] init];

   //。。。。需要做的处理。

   //这里线程结束后立即返回

  [self performSelectorOnMainThread:@selector(endThread) withObject:nil waitUntilDone:NO];

  [pool release];

}

performSelectorOnMainThread通知主线程执行函数endThread。也可以使用performSelector:onThread:withObject:waitUntil 通知某线程执行线程结束后的处理。

线程内不要刷新界面。如果需要刷新界面,通过performSelectorOnMainThread,调出主线程中的方法去刷新。//哇塞这句话太关键了。。终于找到组织了

例如,启动一个线程下载图片:

//启动线程

[NSThread detachNewThreadSelector:@selector(downloadImage:) toTarget:self withObject:url];

//线程函数

//NSURL这个类,都有哪些用处》?

- (void) downloadImage:(NSString*)url{
    
    _subThreed = [NSThread currentThread];
    
    self.uploadPool = [[NSAutoreleasePool alloc] init];
    self.characterBuffer = [NSMutableData data];
    done = NO;
    [[NSURLCache sharedURLCache] removeAllCachedResponses];
    
    NSMutableURLRequest *theRequest = [NSMutableURLRequest requestWithURL:[NSURLURLWithString:url]];
    
    self.connection = [[NSURLConnection alloc] initWithRequest:theRequest delegate:self];
    [self performSelectorOnMainThread:@selector(httpConnectStart) withObject:nil waitUntilDone:NO];
    if (connection != nil) {
        do {
            [[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate distantFuture]]; //这个NSRunLoop貌似很有用
        } while (!done);
    }
    
    self.photo = [UIImage imageWithData:characterBuffer];
    

    //下载结束,刷新(线程间通讯
    [self performSelectorOnMainThread:@selector(fillPhoto) withObject:nil waitUntilDone:NO];
    
    // Release resources used only in this thread.
    self.connection = nil;
    [uploadPool release];
    self.uploadPool = nil;
    
    _subThreed = nil;
}

 

#pragma mark NSURLConnection Delegate methods

/*
 Disable caching so that each time we run this app we are starting with a clean slate. You may not want to do this in your application.
 */

- (NSCachedURLResponse *)connection:(NSURLConnection *)connection willCacheResponse:(NSCachedURLResponse *)cachedResponse {

    return nil;
}

// Forward errors to the delegate.
- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error {
    done = YES;
    [self performSelectorOnMainThread:@selector(httpConnectEnd) withObject:nil waitUntilDone:NO];
    [characterBuffer setLength:0];
    
}

// Called when a chunk of data has been downloaded.
- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data {
    // Process the downloaded chunk of data.
 
    [characterBuffer appendData:data];
    
}

- (void)connectionDidFinishLoading:(NSURLConnection *)connection {
    
    [self performSelectorOnMainThread:@selector(httpConnectEnd) withObject:nil waitUntilDone:NO];
    // Set the condition which ends the run loop.
    done = YES; 
}

 

免责声明:文章转载自《iphone开发多线程》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇performselectoronmainthreadiPad app应用开发系列文章之三 -- iOS的多核编程和内存管理下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

基于透明Socket的JMX超时设置(转,原谅我懒) 规格严格

一、框架代码的实现 使用Socket是最完美的的远程连接超时设置技术,下面是创建Socket对象的代码: 建立连接一般的写法是: Socket s =newSocket(host, port); 而要定制超时的写法则为: SocketAddress addr =newInetSocketAddress(host, port); Socket...

activex嵌入浏览器时线程触发事件

8 推荐 在浏览器中嵌入activex后,线程中触发的事件就没有动静了,如果在调试的情况下,还能发现浏览器有非法错发生。而同样的activex如果使用应用程序来调用则正常。解决方法是取巧的方式,在线程中发出消息,控件响应消息后再FireEvent。 1. 创建控件项目。 2. 类向导, 使用 Add 方法将启动二线程并返回。 下面的代码显示方法启动...

OO第二次博客作业

又完成了三次OO作业,这三次有关多线程的作业对我来说可谓是很大(保护头发)的挑战。 一、从多线程的协同和同步控制方面,分析和总结自己三次作业来的设计策略及变化 第五次作业是设计⼀套由 3 部电梯组成的多电梯调度系统,通过采⽤线程机制,在第三次作业所实现程序的基础上完成新的调度系统程序。第三次作业是调度器持续监控电梯的运动状态变化,从而扫描队列找到相应的请求进...

jvm性能优化及内存分区

jvm性能优化及内存分区2012-09-17 15:51:37 分类:Java Some of the default values for Sun JVMs are listed below.JDK 1.3.1_06 Initial Size Maximum SizeClient JVM 1MB 32MBServer JVM 1MB 64MBJ...

Java模拟异步消息的发送与回调

本文的目的并不是介绍使用的什么技术,而是重点阐述其实现原理。 一、异步和同步 讲通俗点,异步就是不需要等当前执行的动作完成,就可以继续执行后面的动作。 通常一个程序执行的顺序是:从上到下,依次执行。后面的动作必须等前面动作执行完成以后方可执行。这就是和异步相对的一个概念——同步。 案例: A、张三打电话给李四,让李四帮忙写份材料。 B、李四接到电话的时...

在浏览器输入 URL 回车之后发生了什么

注意:本文的步骤是建立在,请求的是一个简单的 HTTP 请求,没有 HTTPS、HTTP2、最简单的 DNS、没有代理、并且服务器没有任何问题的基础上。 大致流程 URL 解析 DNS 查询 TCP 连接 处理请求 接受响应 渲染页面 一、URL 解析 地址解析: 首先判断你输入的是一个合法的 URL 还是一个待搜索的关键词,并且根据你输入的内容进行自动...