Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios GCD调度同步不';不能按顺序完成执行_Ios_Objective C - Fatal编程技术网

Ios GCD调度同步不';不能按顺序完成执行

Ios GCD调度同步不';不能按顺序完成执行,ios,objective-c,Ios,Objective C,我有一个方法可以帮助我将本地standardUserDefaults与Web服务同步。首先,我需要确保数据已成功同步,然后才能让该方法返回。我目前正在努力解决的问题是,我无法让GCD以某种顺序执行和完成任务:首先发布到web服务,然后返回 问题是,第二个调度同步任务首先完成执行,然后是第一个调度同步任务。如何确保执行按计划进行?这是因为NSURLSessionDataTask的特殊情况吗 非常感谢 -(void) syncLocalStorageToMMUsersDB:(void(^)(bool

我有一个方法可以帮助我将本地standardUserDefaults与Web服务同步。首先,我需要确保数据已成功同步,然后才能让该方法返回。我目前正在努力解决的问题是,我无法让GCD以某种顺序执行和完成任务:首先发布到web服务,然后返回

问题是,第二个调度同步任务首先完成执行,然后是第一个调度同步任务。如何确保执行按计划进行?这是因为NSURLSessionDataTask的特殊情况吗

非常感谢

-(void) syncLocalStorageToMMUsersDB:(void(^)(bool success))handler
{
__block bool fb_sync_success = 0;

dispatch_queue_t requestQueue = dispatch_queue_create("com.micromorts.request", DISPATCH_QUEUE_SERIAL);


//if logged in with Facebook, then sync it
if ([_defaults stringForKey:MMFBIdPrefsKey]) {
  // Start NSURLSession
  NSURLSessionConfiguration *defaultConfigObject = [NSURLSessionConfiguration defaultSessionConfiguration];
  NSURLSession *defaultSession = [NSURLSession sessionWithConfiguration: defaultConfigObject delegate: nil delegateQueue: [NSOperationQueue mainQueue]];

  // POST parameters
  NSURL *url = [NSURL URLWithString:@"http://THE.URL.GOES.HERE"];
  NSMutableURLRequest *urlRequest = [NSMutableURLRequest requestWithURL:url];
  NSString *params = [POST PARAMS GO HERE];
  [urlRequest setHTTPMethod:@"POST"];
  [urlRequest setHTTPBody:[params dataUsingEncoding:NSUTF8StringEncoding]];

  // NSURLSessionDataTask returns data, response, and error

  NSURLSessionDataTask *dataTask =[defaultSession dataTaskWithRequest:urlRequest
    completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
        // Handle response
        NSHTTPURLResponse* httpResponse = (NSHTTPURLResponse*)response;
        NSInteger statusCode = [httpResponse statusCode];
        if(error == nil) {
          if (statusCode == 404) {
              NSLog(@"MMAuth.m :: syncLocalStorageToMMUsersDB FB :: FB User not found");
              fb_sync_success = false;

          } else if (statusCode == 200) {
              NSLog(@"MMAuth.m :: syncLocalStorageToMMUsersDB FB :: Successfully synced ");
              fb_sync_success = true;

          } else {
          NSLog(@"MMAuth.m :: syncLocalStorageToMMUsersDB FB :: Sync fail ");
              fb_sync_success = false;
          }
        }
    }
  ];
  //This should finish EXECUTING first
  dispatch_sync(requestQueue, ^{
      [dataTask resume];
  });
}

//This should finish EXECUTING second
dispatch_sync(requestQueue, ^{

    if (fb_sync_success){
       NSLog(@"SUCCESS");
    } else {
       NSLog(@"FAILED");
    }

});
}

如果调用
[dataTask resume]
是异步的,那么
调度同步()
将在执行
-resume
后立即返回,然后随后的
调度同步()
将在执行后立即排队并执行(但在加载数据之前)


将成功/失败逻辑移到完成处理程序块中;这就是为什么存在完成处理程序。

是什么让您认为提交到
requestQueue
的第一个任务没有首先完成?在调用
-resume
后立即放置日志。我打赌你会在成功或失败之前看到它被写出来。我认为您假定
-resume
方法会以某种方式等待任务完成。没有。它只是将其从暂停切换到不暂停;它允许它继续进行。从暂停到不暂停只需要很少的时间。这与任务本身完成所需的时间无关。