博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

多线程

Posted on 2011-04-27 23:42  BradyChen  阅读(548)  评论(0编辑  收藏  举报

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


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


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


函数定义:


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


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


}


- (void)threadFunc:(id)userInfor{


  NSAutoreleasePool*pool = [[NSAutoreleasePoolalloc] 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];


//线程函数


- (void)
downloadImage:(
NSString*)url{
  
   
_subThreed = [
NSThreadcurrentThread];
  
   
self.uploadPool = [[
NSAutoreleasePoolalloc] init];
    self.characterBuffer = [NSMutableDatadata];
    done
= NO;

    [[NSURLCache sharedURLCache]
removeAllCachedResponses];

  
   
NSMutableURLRequest *theRequest = [
NSMutableURLRequestrequestWithURL:[NSURLURLWithString:url]];
  
   
self.connection = [[
NSURLConnectionalloc] initWithRequest:theRequest
delegate:self];

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

    if (connection !=
nil) {

        do {
            [[NSRunLoop currentRunLoop]
runMode:NSDefaultRunLoopMode beforeDate:[NSDate distantFuture]];

        } 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;

}