• 多线程



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


    用到的类是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;

    }


  • 相关阅读:
    接Oracle11g_client精简版安装步骤(2019年11月18日)之Plsql配置
    Oracle11g_client精简版安装步骤(2019年11月18日)
    PC端微信版本过低问题
    Windows下Nginx无法启动且进程里没有?
    Eclipse中复制项目后,怎么更改项目名等相关配置?(2019年10月17日)
    tomcat改端口号
    java基础
    数据库
    数组相关
    Linux系统实战
  • 原文地址:https://www.cnblogs.com/chen1987lei/p/2031241.html
Copyright © 2020-2023  润新知