【问题标题】:How to synchronize two NSURLSessionDataTasks?如何同步两个 NSURLSessionDataTask?
【发布时间】:2014-12-12 13:42:15
【问题描述】:

我不知道如何同步 NSURLSessionDataTask。

如何在 syncInfo1Info2 中同步这两个会话:

- (void) syncInfo1Info2
{
  //How do I sync???
}

- (void) getSomeInfo1
{
NSString *stringToUrl = [[NSString alloc]initWithFormat:@"url"];
NSURLSession *session = [NSURLSession sessionWithConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration]];
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:[stringToUrl stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]]];
NSURLSessionDataTask *task =[session dataTaskWithRequest: request completionHandler:^(NSData *data, NSURLResponse *response, NSError *error){
    //Some code...

        }];
[task resume];
}

- (void) getSomeInfo2
{
NSString *stringToUrl = [[NSString alloc]initWithFormat:@"url"];
NSURLSession *session = [NSURLSession sessionWithConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration]];
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:[stringToUrl stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]]];
NSURLSessionDataTask *task =[session dataTaskWithRequest: request completionHandler:^(NSData *data, NSURLResponse *response, NSError *error){
   //Some code...

}];
[task resume];
}

【问题讨论】:

  • 欢迎来到 Stack Overflow。请花几分钟阅读stackoverflow.com/help/how-to-ask。在您的具体情况下,请考虑添加您迄今为止尝试过的内容以及收到的错误消息(如果有的话)。

标签: ios objective-c xcode concurrency


【解决方案1】:

像这样:

dispatch_group_t group = dispatch_group_create();

- (void) syncInfo1Info2
{
  [self getSomeInfo1];
  [self getSomeInfo2];
  dispatch_group_notify(group, dispatch_get_main_queue(), ^{
     //both tasks have been processed
  });
}

- (void) getSomeInfo1
{
    dispatch_group_enter(group);
    NSString *stringToUrl = [[NSString alloc]initWithFormat:@"url"];
    NSURLSession *session = [NSURLSession sessionWithConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration]];
    NSMutableURLRequest *requestRu = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:[stringToUrl stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]]];
    NSURLSessionDataTask *task =[session dataTaskWithRequest: requestRu completionHandler:^(NSData *data, NSURLResponse *response, NSError *error){
        NSError *err;
        dispatch_group_leave(group);
        }];
    [task resume];
}

- (void) getSomeInfo2
{
    dispatch_group_enter(group);
    NSString *stringToUrl = [[NSString alloc]initWithFormat:@"url"];
    NSURLSession *session = [NSURLSession sessionWithConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration]];
    NSMutableURLRequest *requestRu = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:[stringToUrl stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]]];
    NSURLSessionDataTask *task =[session dataTaskWithRequest: requestRu completionHandler:^(NSData *data, NSURLResponse *response, NSError *error){
        NSError *err;
        dispatch_group_leave(group);
    }];
    [task resume];
}

【讨论】:

    【解决方案2】:

    你可以使用NSOperationQueue在操作之间添加依赖的简单方法

    例如。

    NSOperationQueue  *operationQueue = [[NSOperationQueue alloc] init];
    
    NSBlockOperation *downloadOperation1 = [[NSBlockOperation alloc] init];
     __weak NSBlockOperation *weakOperation1 = downloadOperation1;
    
    [weakOperation1 addExecutionBlock:^{
        [self getSomeInfo1];
    }];
    
    
    NSBlockOperation *downloadOperation2 = [[NSBlockOperation alloc] init];
    __weak NSBlockOperation *weakOperation2 = downloadOperation2;
    
    [weakOperation2 addExecutionBlock:^{
        [self getSomeInfo2];
    }];
    
    [downloadOperation2  addDependency:downloadOperation1];
    [operationQueue addOperation:downloadOperation1];
    [operationQueue addOperation:downloadOperation2];
    

    或者使用这个link中给出的方法

    HTTPMaximumConnectionsPerHost 属性设置为 1 的类中创建 NSURLSession 单例:

    + (NSURLSession *)session
    {
        static NSURLSession *session = nil;
        static dispatch_once_t onceToken;
        dispatch_once(&onceToken, ^{
    
            NSURLSessionConfiguration *configuration = [NSURLSessionConfiguration defaultSessionConfiguration];
    
            [configuration setHTTPMaximumConnectionsPerHost:1];
    
            session = [NSURLSession sessionWithConfiguration:configuration];
    
        });
        return session;
    }
    

    然后使用

    NSURLSessionDataTask *dataTask = 
    [[[self class] session] dataTaskWithURL:url 
                              completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
    }
    [dataTask resume]
    

    【讨论】:

      【解决方案3】:

      我们可以将 api gunc 放在一个类中并在其上创建一个共享实例,在视图控制器类中我们可以像这样调用类实例

      ApiClient.shared.api1() ApiClient.shared.api2()

      由于我们有一个共享实例,所以 api 调用将被同步

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-06-17
        • 1970-01-01
        • 2013-03-12
        • 2021-11-04
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多