我怎么能修改这段代码

时间:2015-01-19 02:28:46

标签: objective-c nsdictionary nsurlconnection nsurl

我使用此功能向服务器发送请求并在NSDictionary中接收JSON响应。

- (void)performRequest:(NSString *)aRequest
{
    NSString *string=[NSString stringWithFormat:@"%@%@",baseURL,aRequest];
    NSURL *url = [NSURL URLWithString: string];
    NSLog(@"string%@",string);
    NSURLRequest *request = [NSURLRequest requestWithURL:url];
    [NSURLConnection sendAsynchronousRequest:request
                                       queue:[NSOperationQueue mainQueue]
                           completionHandler:^(NSURLResponse *response,
                                               NSData *data, NSError *connectionError)
     {
         if (data.length > 0 && connectionError == nil)
         {
             NSDictionary * greeting = [NSJSONSerialization JSONObjectWithData:data
                                                                      options:0
                                                                        error:NULL];
             NSLog(@"%@",greeting2);
         }
     }];
}

我想要的是修改它以便它仍然是一个发送服务URL的函数和一个单独的函数,其中JSON响应来自NSDictionary,因此您可以在其他类中重用它们。

2 个答案:

答案 0 :(得分:0)

我使用了iOS 7引入的网络: NSURLSession 。这是我在项目中使用的网络代码。但我建议你改用 AFNetworking 。这将为您节省更多时间。这取决于您在申请中的需求。

+ (void)requestOperationWithMethod:(NSString *)method
                       withUrl:(NSString *)url
                        header:(NSDictionary *)header
                        params:(NSDictionary *)params
                    completion:(FHCompletionResultBlock)completion {
FHNetworking *network = [FHNetworking shareNetworking];
NSData *bodyData;
NSError *jsonError = nil;
NSData *data = [NSJSONSerialization dataWithJSONObject:params options:kNilOptions error:&jsonError];
if (!jsonError) {
    bodyData = data;
}

// prepare http request header and body data fields
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:url]];
for (NSString *key in header.allKeys) {
    [request setValue:header[key] forHTTPHeaderField:key];
}
[request setHTTPMethod:method];
[request setHTTPBody:bodyData];
[request setTimeoutInterval:30.0f];

[[UIApplication sharedApplication] setNetworkActivityIndicatorVisible:YES];
[[network.session dataTaskWithRequest:request completionHandler:^(NSData *data, NSURLResponse *response, NSError *error){
    NSError *jsonError = nil;
    NSDictionary *json = [NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:&jsonError];

    if (jsonError)
        completion(nil, jsonError);
    else {
        NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse *)response;
        if (httpResponse.statusCode >= 400) {

            if (json[@"code"] && json[@"error"]) {
                NSError *error = [NSError errorWithDomain:@"Error" code:[json[@"code"] integerValue] userInfo:@{NSLocalizedDescriptionKey: NSLocalizedString(json[@"error"], nil)}];
                completion(nil, error);
            }
            else {
                NSError *error = [NSError errorWithDomain:@"Error" code:-1 userInfo:@{NSLocalizedDescriptionKey: NSLocalizedString(@"Unknown error", nil)}];
                completion(nil, error);
            }
        }
        else {
            completion(json, nil);
        }
    }
    [[UIApplication sharedApplication] setNetworkActivityIndicatorVisible:NO];
}] resume];

}

答案 1 :(得分:0)

您可以将方法更改为completionHandler参数本身:

- (void)performRequest:(NSString *)aRequest completionHandler:(void(^)(NSDictionary *responseObject, NSError *error))completionHandler
{
    NSString *string=[NSString stringWithFormat:@"%@%@",baseURL,aRequest];
    NSURL *url = [NSURL URLWithString: string];
    NSURLRequest *request = [NSURLRequest requestWithURL:url];
    [NSURLConnection sendAsynchronousRequest:request
                                       queue:[NSOperationQueue mainQueue]
                           completionHandler:^(NSURLResponse *response,
                                               NSData *data, NSError *connectionError) {
        if (data.length > 0 && connectionError == nil) { 
            NSError *parseError;
            NSDictionary *responseObject = [NSJSONSerialization JSONObjectWithData:data
                                                                           options:0
                                                                             error:&parseError];
            completionHandler(responseObject, parseError);
        } else {
            completionHandler(nil, error);
        }
    }];
}

现在你可以在完成处理程序中调用它并提供你想要的任何东西:

[self performRequest:requestString completionHandler:^(NSDictionary *responseObject, NSError *error) {
    if (responseObject) {
        // everything is good; use your NSDictionary here
    } else {
        // handle error here
    }
}];