在NSURLSession之后同步执行一个方法

时间:2015-12-01 20:40:36

标签: ios objective-c synchronization nsurlsession

我目前正在尝试在NSURLSession完成后执行一个方法。问题是我无法以任何方式管理其对象的异步性质。我按照其他问题的建议尝试了GCD和NSOperation,但没有任何变化:在使用 dataTaskWithRequest:completionHandeler:进行初始化之后,应用程序开始执行程序中的下一个方法。

以下是实现网络的方法:

-(void)sendData{
    NSData *JSONdata = [NSJSONSerialization dataWithJSONObject:userInfoToJSON options:0 error:&error];

            NSURL *url = [NSURL URLWithString:@"http://mobdev2015.com/register.php"];
            NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
            NSString *postLength = [NSString stringWithFormat:@"%lu", (unsigned long)[JSONdata length]];

            [request setHTTPMethod:@"POST"];
            [request setValue:@"application/json" forHTTPHeaderField:@"Accept"];
            [request setValue:@"application/json" forHTTPHeaderField:@"Content-Type"];
            [request setValue:postLength forHTTPHeaderField:@"Content-Length"];
            [request setHTTPBody:JSONdata];

            [[session  dataTaskWithRequest:request completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
                requestReply = [[NSString alloc] initWithData:data encoding:NSASCIIStringEncoding];
            }]resume];
            });
}

以下是调用上面的方法以及我想要实现同步执行的方法:

-(void)MethodWhichNeedsToBeSync{
//Creating a JSON object..
[self sendData:userInfoToJSON];
//MethodB wants to be executed if and only if sendData is completed
[self MethodB];
}

感谢您的回复。

2 个答案:

答案 0 :(得分:2)

在完成异步方法后执行方法的方法是在异步方法的完成块(或闭包)中调用该方法。 / p>

对于您的情况,它看起来像这样:

[[session  dataTaskWithRequest:request completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
    requestReply = [[NSString alloc] initWithData:data encoding:NSASCIIStringEncoding];

    if (!error) {
        [self MethodB];
    }

}]resume];
});

将成功完成异步方法后运行的调用移入完成处理程序。

当且仅当sendData完成时,这将完成MethodB的执行。

答案 1 :(得分:0)

据我从NSURLSession文档中可以看出,没有办法使用它来发出同步请求。我认为这是因为你真的不应该拨打可以阻止主队列的电话 但是,如果不需要使用NSURLSession,则只需使用NSURLConnection即可。您可以使用您的请求初始化它并调用" sendSynchronousRequest:returningResponse:"。