iOS9 sendSynchronousRequest deprecated

后端 未结 7 1404
自闭症患者
自闭症患者 2020-12-24 13:15

Warning:\'sendSynchronousRequest(_:returningResponse:)\' was deprecated in iOS 9.0: Use [NSURLSession dataTaskWithRequest:completionHandler:] (see NSURLSe

7条回答
  •  执笔经年
    2020-12-24 13:44

    I wrote the following solution for the cases when you actually need for synchronous request which blocks the current thread execution. I use this code for migration from NSURLConnection to NSURLSession in the complex solution where it was quite a hassle to just change to async approach. With this solution the migration is just method name replacement.

    NOTE: If you have a simple case, please use the accepted answer instead.

    - (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;
    }
    

    Usage (simple replace NSURLConnection to this method):

    //NSData *data = [NSURLConnection sendSynchronousRequest:theRequest returningResponse:&resp error:&err];
    NSData *data = [self sendSynchronousRequest:theRequest returningResponse:&resp error:&err];
    

提交回复
热议问题