iOS专攻资源__网络专题iOSeriOS网络

iOS 异步请求等待传值方法小结

2016-03-14  本文已影响3695人  Monkey_ALin

前言

小结

1. RunLoop

NSURLSessionDataTask *task = [[NSURLSession sharedSession] dataTaskWithRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:@"http://www.baidu.com"]] completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
        NSLog(@"A");
        CFRunLoopStop(CFRunLoopGetMain());
    }] ;
    [task resume];
 CFRunLoopRun();
 NSLog(@"B");

2. GCD的group

dispatch_group_t group = dispatch_group_create();
    dispatch_queue_t queue = dispatch_get_global_queue(0, 0);
    dispatch_group_async(group, queue, ^{
        NSLog(@"A");
    });
    dispatch_group_notify(group, dispatch_get_main_queue(), ^{
        NSLog(@"B");
    });

3. dispatch_barrier_async

 dispatch_queue_t queue =  dispatch_queue_create(0, DISPATCH_QUEUE_CONCURRENT);
    dispatch_async(queue, ^{
        NSLog(@"A");
    });
    dispatch_async(queue, ^{
        NSLog(@"C");
    });
    dispatch_barrier_async(queue, ^{
        NSLog(@"拿到了A的值");
    });
    
    dispatch_async(queue, ^{
        NSLog(@"D");
    });
    dispatch_async(queue, ^{
        NSLog(@"E");
    });dispatch_async(queue, ^{
        NSLog(@"F");
    });

4.NSOperationQueue

NSOperationQueue *queue = [[NSOperationQueue alloc] init];
    NSBlockOperation *p1 = [NSBlockOperation blockOperationWithBlock:^{
        NSLog(@"A");
    }];
    NSBlockOperation *p2 = [NSBlockOperation blockOperationWithBlock:^{
        NSLog(@"B");
    }];
    NSBlockOperation *p3 = [NSBlockOperation blockOperationWithBlock:^{
        NSLog(@"C");
    }];
    [p3 addDependency:p1];
    [p3 addDependency:p2];
    // waitUntilFinished是否阻塞当前线程
    [queue addOperations:@[p1,p2,p3] waitUntilFinished:NO];
    
    // 如果是NO,那么这行打印就是随机的, 反之就是等A,B,C都打印完之后才执行
    NSLog(@"HAHA");

5. 使用AFN中的batchOfRequestOperations

AFHTTPRequestOperation *queue = [[AFHTTPRequestOperation alloc] initWithRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:@"http://www.baidu.com"]]];
    [queue setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) {
        NSLog(@"A");
    } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
        NSLog(@"A");
    }];
    [queue resume];
    
    AFHTTPRequestOperation *queue2 = [[AFHTTPRequestOperation alloc] initWithRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:@"http://www.baidu.com"]]];
    [queue2 setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) {
        NSLog(@"B");
    } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
        NSLog(@"B");
    }];
    [queue2 resume];
    
    NSArray *operations = [AFHTTPRequestOperation batchOfRequestOperations:@[queue, queue2] progressBlock:^(NSUInteger numberOfFinishedOperations, NSUInteger totalNumberOfOperations) {
        NSLog(@"%ld/%ld", numberOfFinishedOperations, totalNumberOfOperations);
    } completionBlock:^(NSArray *operations) {
        NSLog(@"C");
    }];
    
    [[NSOperationQueue mainQueue] addOperations:operations waitUntilFinished:NO];

6.其他

联系我

<a href="https://github.com/SunLiner">github</a>

<a href="http://www.weibo.com/5589163526/profile?rightmod=1&wvr=6&mod=personinfo&is_all=1">微博</a>

<a href="http://www.jianshu.com/users/9723687edfb5/latest_articles">简书</a>

上一篇 下一篇

猜你喜欢

热点阅读