使用方法参数

时间:2014-03-09 17:01:24

标签: ios objective-c

我有一个定期从服务器下载JSON结果的方法,所以我想学习如何输入参数,而不是一遍又一遍地输入相同的方法!

这是我到目前为止所做的:

-(void)downloadData:(NSString *)saveto downloadURL:(NSString *)URL parameters:(NSString *)params{}

除了我试图保存我的结果之外,它大部分都正常工作。我希望将我的结果存储在名为“locations”的数组中,我试图在“saveto”NSString中传递名称位置,但我不知道该怎么做?

最初我用过:

locations =[[NSMutableArray alloc] init];

我想以某种方式传递我希望保存的数组的名称,就像这样?:

saveto = [[NSMutableArray alloc] init];

运行方法的示例:

[self downloadData:[NSString stringWithFormat:@"locations"] downloadURL:[NSString stringWithFormat:@"http://test.com:80/test/locations.php"] parameters:[NSString stringWithFormat:@"welcome=hi"]];

2 个答案:

答案 0 :(得分:2)

您还没有向我们展示您如何检索数据(同步或异步?)以及您是如何构建该请求的(我很好奇paramssaveto以及{{1}是所有字符串参数)。

但我建议异步执行(因为你永远不想阻止主队列)。在这种情况下,您提供一个“块”参数,调用者可以指定下载完成时要运行的代码块。

所以,你可能看起来像URL

downloadData

可以调用:

- (void)downloadDataWithURL:(NSURL *)URL parameters:(NSDictionary *)parameters completion:(void (^)(NSArray *array, NSError *error))completion
{
    // build your request using the URL and parameters however you want

    NSURLRequest *request = ...;

    // now issue the request asynchronously

    [NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) {
        if (!data) {
            completion(nil, connectionError);
            return;
        }

        NSError *parseError = nil;
        NSArray *array = [NSJSONSerialization JSONObjectWithData:data options:0 error:&parseError];
        completion(array, parseError);
    }];
}

仅供参考,我将NSURL *URL = [NSURL URLWithString:@"http://test.com:80/test/locations.php"]; NSDictionary *parameters = @{@"welcome" : @"hi"}; [self downloadDataWithURL:URL parameters:parameters completion:^(NSArray *array, NSError *error) { if (error) { NSLog(@"downloadDataWithURL error: %@", error); return; } self.locations = array; }]; 作为URL对象(符合惯例)。我还将NSURL设为parameters(因此,如果您发出的NSDictionary请求或GET类型POST请求,您可以更轻松地执行此操作必要的application/x-www-form-urlencoded;如果是JSON请求,这也可以更容易地发出正确的JSON请求。)

但是随意将参数CFURLCreateStringByAddingPercentEscapesURL更改为对您的特定实现有意义的任何类型,但希望这说明了这个想法。添加一个额外的完成块参数,该参数将是下载完成后将运行的代码块,然后调用者对结果执行任何操作。

答案 1 :(得分:1)

你不应该重新发明轮子,你应该使用AFNetworking或RestKit之类的框架来为你做这些事情。除了为您完成工作之外,它还为您提供了非常强大的工具,如可达性和错误处理,最重要的是它处理JSON(以及许多其他格式)的转换。当您使用AFNetworking时,您将获得一个名为responseObject的NSDictionary,您可以在很多方面使用它,包括设置NSString。大多数情况下,您只需将该字典用作UI的dataSource,这样就可以完成所有工作。

AFNetworking代码如下所示:

AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
[manager GET:@"http://example.com/resources.json" parameters:nil success:^(AFHTTPRequestOperation *operation, id responseObject) {
    NSLog(@"JSON: %@", responseObject);
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
    NSLog(@"Error: %@", error);
}];

正如您只能在几行代码中看到的那样,您可以处理成功,失败以及创建包含所有信息的对象。无需[[NSDictionary alloc] init]

This is one of the many many great tutorials on AFNetworking