美文网首页
iOS 异步操作

iOS 异步操作

作者: 风之化身呀 | 来源:发表于2018-11-09 00:28 被阅读171次

    1.NSThread

    • 启动子线程
      1、[thread start]
      2、detachNewThreadSelector
      3、performSelectorInBackground(推荐)
         //方法1:使用对象方法
        //创建一个线程,第一个参数是请求的操作,第二个参数是操作方法的参数
        NSThread *thread=[[NSThread alloc]initWithTarget:self selector:@selector(loadImage) object:nil];
        //启动一个线程,注意启动一个线程并非就一定立即执行,而是处于就绪状态,当系统调度时才真正执行
        [thread start];
        
        //方法2:使用类方法
        [NSThread detachNewThreadSelector:@selector(loadImage) toTarget:self withObject:nil];
    
        // 方法3:使用 performSelectorInBackground
        [self performSelectorInBackground:@selector(loadImage:) withObject:[NSNumber numberWithInt:i]];
    
    • 回到主线程
      performSelectorOnMainThread,是NSObject的分类方法,每个NSObject对象都有此方法
    [self performSelectorOnMainThread:@selector(updateImage:) withObject:data waitUntilDone:YES];
    

    2.NSBlockOperation

    • 启动子线程
    //创建操作队列
    NSOperationQueue *operationQueue=[[NSOperationQueue alloc]init];
    operationQueue.maxConcurrentOperationCount=5;//设置最大并发线程数
    [operationQueue addOperationWithBlock:^{
        [self loadImage:[NSNumber numberWithInt:i]];
     }];
    
    • 回到主线程
    [[NSOperationQueue mainQueue] addOperationWithBlock:^{
         [self updateImageWithData:data andIndex:i];
    }];
    

    3.GCD

    • 启动子线程
    /*创建一个串行队列
         第一个参数:队列名称
         第二个参数:队列类型
     */
        dispatch_queue_t serialQueue=dispatch_queue_create("myThreadQueue1", DISPATCH_QUEUE_SERIAL);//注意queue对象不是指针类型
        dispatch_async(serialQueue, ^{
             [self loadImage:[NSNumber numberWithInt:i]];
        });
    
    • 回到主线程
        // 获取主线程
        dispatch_queue_t mainQueue= dispatch_get_main_queue();
        dispatch_sync(mainQueue, ^{
            [self updateImageWithData:data andIndex:i];
        });
    

    锁机制 @synchronized

    解决资源抢占的问题

    -(NSData *)requestData:(int )index{
        NSData *data;
        NSString *name;
        //线程同步
        @synchronized(self){
            if (_imageNames.count>0) {
                name=[_imageNames lastObject];
                [_imageNames removeObject:name];
            }
        }
        if(name){
            NSURL *url=[NSURL URLWithString:name];
            data=[NSData dataWithContentsOfURL:url];
        }
        return data;
    }
    

    相关文章

      网友评论

          本文标题:iOS 异步操作

          本文链接:https://www.haomeiwen.com/subject/heugxqtx.html