在 objective-c 中遇到带有 SynchronousRequest 的 NSURLSessionDataTask 问题

Facing an issue with NSURLSessionDataTask with SynchronousRequest in objective-c

这是我使用 NSURLConnection sendSynchronousRequest 的工作代码:

+ (Inc*)getData:(NSString*)inUUID {
    NSString* urlString = [NSString stringWithFormat:@"/inc/%@", incUUID];
    NSURLRequest* request = [[HttpRequest requestWithRelativePath:urlString] toNSMutableURLRequest];
    NSDictionary* json = [self getJSONForRequest:request];
    return [Inc incFromDictionary:json];
}  
+ (NSDictionary*)getJSONForRequest:(NSURLRequest*)request {
    NSData* responseData = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil];
    return  [NSJSONSerialization JSONObjectWithData:responseData options:NSJSONReadingAllowFragments error:nil];
}  

但是,sendSynchronousRequest:request 已被弃用。

所以,我用NSURLSessionDataTask代替了sendSynchronousRequest。这是我实现的代码:

+ (Inc*)getData1:(NSString*)inUUID {
    NSString* urlString = [NSString stringWithFormat:@"/in/%@", inUUID];
    NSURLRequest* request = [[HttpRequest requestWithRelativePath:urlString] toNSMutableURLRequest];
    //NSDictionary* json = [self getJSONForRequest1:request];
    __block NSDictionary* json;

    dispatch_async(dispatch_get_main_queue(), ^{
        [self getJsonResponse1:request success:^(NSDictionary *responseDict) {
            json = [responseDict valueForKeyPath:@"detail"];;
            //return [Inc incFromDictionary:json];

        } failure:^(NSError *error) {
            // error handling here ...
        }];
    });
    return [Inc incFromDictionary:json];
}  
+ (void)getJsonResponse1:(NSURLRequest *)urlStr success:(void (^)(NSDictionary *responseDict))success failure:(void(^)(NSError* error))failure
{
    NSURLSessionDataTask *dataTask1 = [[NSURLSession sharedSession] dataTaskWithRequest:urlStr completionHandler:^(NSData *data, NSURLResponse *response,
                                                                                                                   NSError *error) {
        NSLog(@"%@",data);
        if (error)
            failure(error);
        else {
            NSDictionary *json  = [NSJSONSerialization JSONObjectWithData:data options:0 error:nil];
            NSLog(@"%@",json);
            success(json);
        }
    }];
    [dataTask1 resume];    // Executed First
}  

问题是在完成 api 调用之前 getData1 中的 return 语句调用。

提前致谢。

如评论中所述,您需要一个完成处理程序。

像这样(未经测试):

+ (void)getData1:(NSString*)inUUID success:(void (^)(NSDictionary *responseDict))success failure:(void(^)(NSError* error))failure {
    NSString* urlString = [NSString stringWithFormat:@"/in/%@", inUUID];
    NSURLRequest* request = [[HttpRequest requestWithRelativePath:urlString] toNSMutableURLRequest];

    [self getJsonResponse1:request success:^(NSDictionary *responseDict) {
        NSDictionary* json = [responseDict valueForKeyPath:@"detail"];
        success(json);

    } failure:^(NSError *error) {
        failure(error);
    }];
}


+ (void)getJsonResponse1:(NSURLRequest *)urlStr success:(void (^)(NSDictionary *responseDict))success failure:(void(^)(NSError* error))failure
{
    NSURLSessionDataTask *dataTask1 = [[NSURLSession sharedSession] dataTaskWithRequest:urlStr completionHandler:^(NSData *data, NSURLResponse *response,
                                                                                                                   NSError *error) {
        NSLog(@"%@",data);
        if (error)
            failure(error);
        else {
            NSDictionary *json  = [NSJSONSerialization JSONObjectWithData:data options:0 error:nil];
            NSLog(@"%@",json);
            success(json);
        }
    }];
    [dataTask1 resume];    // Executed First
}

并打电话给

[MyClass getData1:@"asdf" success:^(NSDictionary *responseDict) {
    dispatch_async(dispatch_get_main_queue(), ^{
        NSDictionary *json = [responseDict valueForKeyPath:@"detail"];
        Inc *inc = [Inc incFromDictionary:json];
        // do something witrh `inc`

    });
} failure:^(NSError *error) {
    // error handling here ...
}];

考虑使用 class(es) 的实例和实例方法,而不仅仅是 class 方法。