UI中多线程总结

       所有应用程序都是一个进程,打开应用程序就进入一个进程,给进程分配内存空间,进程里可以分配很多线程,一个进程里面最少有一个线程.线程与线程之间是互不干扰的, 当只有一个主线程时为单线程.

       经常用多线程的地方:1.大量运算for循环; 2.数据读取(本地, 数据库查询所有数据的时候); 3. 进行网络请求的时候(同步网络请求).



       常见的多线程方式 


       1.NSThread

       初始化方法 :  

       (1). NSThread *thread = [NSThread alloc] initWithTarget: self selector:@selector (buttonAction) object:nil];

       [thread start];

       [thread release];

        (2). [NSThread detachNewThreadSelector: @selector(buttonAction) toTarget:self withObject: nil];


      2. NSObject

       初始化方法:

        [self performSelectorInBackground: @selector(buttonAction) withObject:nil];


      3. NSOperation  和 NSOperationQueue(线程队列)(同时运行的多线程建议10个以内)

      一般不直接使用NSOperation而是建一个类(例如 MyOperation)继承于NSOperation 

      在MyOperation中需要重写main函数,并添加自动释放池.

           MyOperation *my = [[MyOperation alloc] init];

     [my start];  加载queue中会自动调用start;

     NSOperationQueue *queue = [[NSOperationQueue alloc] init]; 

     queue.maxConcurrentOperationCount = 1; // 设置最大并发数;

             最大并发数为 1 的时候我们称   线程与线程之间是同步的  ( 多条有并发 );

          [queue addOperation:my];

    

     MyOperation *my2 = [[MyOperation alloc] init];

     [queue addOperation:my2]; 线程的并发;没有顺序;

     [queue release];


       4.NSBLockOperation

        初始化方法:

    NSBlockOperation *block = [NSBlockOperation blockOperationWithBlock:^{

     @autoreleasepool {

        // 在次添加方法;

        // 所有跑多线程的地方都要加自动释放池

    }];

    NSOperationQueue *queue = [[NSOperationQueue alloc] init];

    [queue addOperation:block];

    [queue release];


        5.NSInvocationOperation 

         使用方法:

            NSInvocationOperation *invocation = [[NSInvocationOperation alloc]           initWithTarget:self selector:@selector(button1Action) object:nil];

    [invocation start];

     NSOperationQueue *queue = [[NSOperationQueue alloc] init];

    [queue addOperation:invocation];

    [queue release];

         (object为往形参上传值的)


        6.GCD多线程 

         GCD多线程为c语言,不能写自动释放池;

        第一步:创建一个同步线程队列

        dispatch_queue_t queue = dispatch_queue_create("first", DISPATCH_QUEUE_SERIAL);

         第二部:异步执行同步线程队列  (将block里面的内容放到queue中异步执行)

    dispatch_async(queue, ^{

     // 多线程代码;  

     // 显示到界面上,所有跟UI相关的内容全部都要在主线程中运行;

     // 返回主线程

        dispatch_async(dispatch_get_main_queue(), ^{

                // 在主线程中运行的代码;

                

            });

        });


          7.//默认并行队列;

        dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{

     // 程序在此默认为同步;

        dispatch_async(dispatch_get_main_queue(), ^{

      // 返回主线程;

      // 在主线程中运行的代码  

                 

        });

        });

    

    

    早期的NSObject,NSThread,NSOperation 返回主线程方式;

    [self performSelectorOnMainThread:@selector(creatImage:) withObject:@"iiii" waitUntilDone:YES];






  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值