首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用方法参数

使用方法参数
EN

Stack Overflow用户
提问于 2014-03-09 17:01:23
回答 2查看 134关注 0票数 0

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

以下是我到目前为止所拥有的:

代码语言:javascript
复制
-(void)downloadData:(NSString *)saveto downloadURL:(NSString *)URL parameters:(NSString *)params{}

它主要是工作正常,除了我试图保存我的结果。我希望将我的结果存储在一个名为" locations“的数组中,我试图在"saveto”NSString中传递名称位置,但不确定如何这样做?

我最初用的是:

代码语言:javascript
复制
locations =[[NSMutableArray alloc] init];

我想以某种方式将我想要保存的数组的名称传递给如下所示:

代码语言:javascript
复制
saveto = [[NSMutableArray alloc] init];

运行方法的示例:

代码语言:javascript
复制
[self downloadData:[NSString stringWithFormat:@"locations"] downloadURL:[NSString stringWithFormat:@"http://test.com:80/test/locations.php"] parameters:[NSString stringWithFormat:@"welcome=hi"]];
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-03-09 17:19:14

您还没有向我们展示如何检索数据(同步还是异步?)也不知道如何构建该请求(奇怪的是,paramssavetoURL都是字符串参数)。

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

因此,您可能有类似于以下内容的downloadData

代码语言:javascript
复制
- (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);
    }];
}

并可被援引为:

代码语言:javascript
复制
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;
}];

FYI,我使URL成为一个NSURL对象(以符合常规实践)。我还将parameters设置为NSDictionary (因此,如果您正在发出GET请求或application/x-www-form-urlencoded类型的POST请求,您可以更容易地完成必要的CFURLCreateStringByAddingPercentEscapes;如果是JSON请求,这也使发出正确的JSON请求更加容易)。

但是,可以随意地将参数URLparameters更改为对特定实现有意义的任何类型,但希望这说明了这个想法。添加一个额外的完成块参数,这将是在下载完成时运行的代码块,然后调用方对结果做它想做的任何事情。

票数 2
EN

Stack Overflow用户

发布于 2014-03-09 17:17:19

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

AFNetworking代码如下所示:

代码语言:javascript
复制
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]

这是许多关于AFNetworking的伟大教程之一。

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

https://stackoverflow.com/questions/22285150

复制
相关文章

相似问题

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