• iOS线程


    昨天在项目中使用到了以前所没有使用过的线程,今天有时间来简单的学习一下。

    一.线程的创建分为三种方法

    1. (id)init; // designated initializer  
    2. (id)initWithTarget:(id)target selector: (SEL)selector object:(id)argument; 

    以上两种方法创建的线程方法,需要另外调用 “start”方法来启动该线程

      3.(void)detachNewThreadSelector:  (SEL)aSelector toTarget:  (id)aTarget withObject:  (id)anArgument 

    而上面这种创建线程的方法,则不需要再额外调用其他方法来启动线程。

       4. [selfperformSelectorInBackground:@selector(threadAction) withObject:self];

      也不用调用启动方法。更多的使用县城方法,倾向于使用这种方式。

      5.NSOperationQueue *operationQueue = [[NSOperationQueuealloc]init];

        [operationQueue addOperationWithBlock:^{

            for (int i = 0; i < 30; i++) {

                NSLog(@"多线程:%d",i);

            }

        }];

      6.

    //1.线程池:这个对象可设置线程执行优先级和线程并发数(同时段执行多少线程)

        NSOperationQueue *operationQueue = [[NSOperationQueuealloc]init];

        [operationQueue addOperationWithBlock:^{

            for (int i = 0; i < 30; i++) {

                NSLog(@"多线程:%d",i);

            }

        }];

        

        //设置并发数为1,线程池中同一时间只能执行一个线程

        operationQueue.maxConcurrentOperationCount = 1;

        

        NSInvocationOperation *operation1 = [[NSInvocationOperationalloc] initWithTarget:selfselector:@selector(operationAction1) object:nil];

        //设置线程的优先级

        [operation1 setQueuePriority:NSOperationQueuePriorityLow];

        NSInvocationOperation *operation2 = [[NSInvocationOperationalloc] initWithTarget:selfselector:@selector(operationAction1) object:nil];

        [operation2 setQueuePriority:NSOperationQueuePriorityHigh];

        

        //把线程添加进线程池中去

        [operationQueue addOperation:operation1];

        [operationQueue addOperation:operation2];

    二:1。暂时遇到一个说法,更新UI必须得回到主线程。

    暂时我不清楚这样的原因,并且什么情况,或者说怎么使用线程方法才是回到主线程,对于我来说还是一个迷。

      2。清楚的是,调用以下这个方法是回到主线程。(下面这个方法,也在很多情况下被用到,以此来回到主线程来更新UI)

    用NSObject的类方法  performSelectorInBackground:withObject: 创建一个线程:
    [Obj performSelectorInBackground:@selector(doSomething) withObject:nil];

    三:下面这一段代码或许就是对问题二得一个合理得解释。利用一中得三类方法开得线程都不是主线程,所以在下面代码中,新开得线程方法里下载完图片之后,需要返回到主线程来更新UI。

    //
    // ViewController.m
    // NSThreadDemo
    //
    // Created by rongfzh on 12-9-23.
    // Copyright (c) 2012年 rongfzh. All rights reserved.
    //

    #import "ViewController.h"
    #define kURL @"http://avatar.csdn.net/2/C/D/1_totogo2010.jpg"
    @interface ViewController ()

    @end

    @implementation ViewController

    -(void)downloadImage:(NSString *) url{
    NSData *data = [[NSData alloc] initWithContentsOfURL:[NSURL URLWithString:url]];
    UIImage *image = [[UIImage alloc]initWithData:data];
    if(image == nil){

    }else{
    [self performSelectorOnMainThread:@selector(updateUI:) withObject:image waitUntilDone:YES];
    }
    }

    -(void)updateUI:(UIImage*) image{
    self.imageView.image = image;
    }


    - (void)viewDidLoad
    {
    [super viewDidLoad];

    // [NSThread detachNewThreadSelector:@selector(downloadImage:) toTarget:self withObject:kURL];
    NSThread *thread = [[NSThread alloc]initWithTarget:self selector:@selector(downloadImage:) object:kURL];
    [thread start];
    }

    - (void)didReceiveMemoryWarning
    {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
    }

    @end

  • 相关阅读:
    友盟冲突解决com.umeng.weixin.handler.UmengWXHandler cannot be cast to com.umeng.socialize.handler.UMWXHandler
    插入mysql失败,因为java数据类型是个实体类,加上.id就好了
    app升级注意事项version
    关于ehcache缓存中eternal及timeToLiveSeconds和timeToIdleSeconds的说明
    WinFom解决最小化最大化后重绘窗口造成闪烁的问题
    Redis 发布订阅
    Redis 发布订阅
    ASPxGridView
    ASPxGridView
    C#-WebRequest 超时不起作用
  • 原文地址:https://www.cnblogs.com/wskgjmhh/p/3471212.html
Copyright © 2020-2023  润新知