• iphone开发多线程


     

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

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

     
  • 相关阅读:
    判断整除
    洛谷2018-7月月赛
    luogu_P1177 【模板】快速排序 (快排和找第k大的数)
    lowbit() 运算
    64位整数乘法 (二进制思想)
    poj_1995 Raising Modulo Numbers (快速幂)
    poj_3179 Corral the Cows (二分+二维前缀和+离散化)
    Spring-profile 不同环境配置方法
    Spring-id,name 名称,别名关系
    Leecode no.20 合理的括号
  • 原文地址:https://www.cnblogs.com/linyawen/p/2576128.html
Copyright © 2020-2023  润新知