首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >iOS9 sendSynchronousRequest已弃用

iOS9 sendSynchronousRequest已弃用
EN

Stack Overflow用户
提问于 2015-09-18 11:10:05
回答 7查看 34.2K关注 0票数 30

Warning:'sendSynchronousRequest(_:returningResponse:)‘在iOS 9.0中已弃用:使用NSURLSession dataTaskWithRequest:completionHandler:

代码语言:javascript
运行
复制
urlData = try NSURLConnection.sendSynchronousRequest(request, returningResponse:&response)

有关于如何摆脱这个警告的想法吗?我刚刚从Swift 1.2升级到Swift 2

更新: Fonix被标记为我的最佳答案。如果你想添加一个try语句,我将他的回答修改如下:

代码语言:javascript
运行
复制
urlData = try NSURLSession.dataTaskWithRequest(<#request: NSURLRequest#>, completionHandler: <#((NSData!, NSURLResponse!, NSError!) -> Void)?##(NSData!, NSURLResponse!, NSError!) -> Void#>)
EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2015-09-18 17:51:28

请使用NSURLSession,如下所示:

对于Objective-C

代码语言:javascript
运行
复制
NSURLSession *session = [NSURLSession sharedSession];
[[session dataTaskWithURL:[NSURL URLWithString:londonWeatherUrl]
          completionHandler:^(NSData *data,
                              NSURLResponse *response,
                              NSError *error) {
            // handle response

  }] resume];

对斯威夫特来说

代码语言:javascript
运行
复制
var request = NSMutableURLRequest(URL: NSURL(string: "YOUR URL"))
var session = NSURLSession.sharedSession()
request.HTTPMethod = "POST"

var params = ["username":"username", "password":"password"] as Dictionary<String, String>

var err: NSError?
request.HTTPBody = NSJSONSerialization.dataWithJSONObject(params, options: nil, error: &err)
request.addValue("application/json", forHTTPHeaderField: "Content-Type")
request.addValue("application/json", forHTTPHeaderField: "Accept")

var task = session.dataTaskWithRequest(request, completionHandler: {data, response, error -> Void in
    println("Response: \(response)")})

task.resume()
票数 43
EN

Stack Overflow用户

发布于 2016-05-21 00:56:21

当你实际需要同步请求阻塞当前线程执行时,我写了下面的解决方案。我使用这段代码在复杂的解决方案中从NSURLConnection迁移到NSURLSession,其中是一个相当麻烦的,只需更改为异步方法。使用此解决方案,迁移只是方法名称替换。

注意:如果您有一个简单的案例,请使用接受的答案。

代码语言:javascript
运行
复制
- (NSData *)sendSynchronousRequest:(NSURLRequest *)request returningResponse:(NSURLResponse **)response error:(NSError **)error
{

    NSError __block *err = NULL;
    NSData __block *data;
    BOOL __block reqProcessed = false;
    NSURLResponse __block *resp;

    [[[NSURLSession sharedSession] dataTaskWithRequest:request completionHandler:^(NSData * _Nullable _data, NSURLResponse * _Nullable _response, NSError * _Nullable _error) {
        resp = _response;
        err = _error;
        data = _data;
        reqProcessed = true;
    }] resume];

    while (!reqProcessed) {
        [NSThread sleepForTimeInterval:0.02];
    }
    if (response != nil)
        *response = resp;
    if (error != nil)
        *error = err;
    return data;
}

用法(简单地将NSURLConnection替换为此方法):

代码语言:javascript
运行
复制
//NSData *data = [NSURLConnection sendSynchronousRequest:theRequest returningResponse:&resp error:&err];
NSData *data = [self sendSynchronousRequest:theRequest returningResponse:&resp error:&err];
票数 26
EN

Stack Overflow用户

发布于 2017-05-20 00:47:53

如果你需要阻塞当前线程(就像Mike Keskinov的答案),最好使用gdc信号量,而不是执行NSThread :0。例如:

代码语言:javascript
运行
复制
dispatch_semaphore_t semaphore = dispatch_semaphore_create(0);
NSURLSession *session = [NSURLSession sharedSession];
[[session dataTaskWithURL:[NSURL URLWithString:londonWeatherUrl]
          completionHandler:^(NSData *data,
                              NSURLResponse *response,
                              NSError *error) {
            // handle response
            dispatch_semaphore_signal(semaphore);

  }] resume];

dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);

和Swift (在5.0上测试):

代码语言:javascript
运行
复制
let semaphore = DispatchSemaphore(value:0)

URLSession.shared.dataTask(with: serverUrl) { (httpData, response, error) in
    // handle response
    semaphore.signal()
}.resume()

semaphore.wait()
票数 22
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32643207

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档