ios - 使用方法参数

标签 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"]];

最佳答案

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

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

因此,您可能拥有看起来像这样的 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,您可以更轻松地执行必要的CFURLCreateStringByAddingPercentEscapes;如果是JSON请求,这也可以更轻松地发出正确的JSON请求).

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

关于ios - 使用方法参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22285150/

相关文章:

ios - 了解 UILocalNotification 时区

ios - 滚动时 TableView UILabel 对齐方式发生变化

ios - 有什么方法可以使用正则表达式或通配符从 NSUserDefaults 获取对象

ios - iOS6 中无法从后台线程调用主线程上的代码

ios - AWS S3 元数据 iOS

ios - 在时间间隔后更改整数值 ios

ios - 如何在 JavaScriptCore 中包含外部库?

ios - 如何一次渲染多个 SpriteKit 节点?

iphone - __clang_analyzer__ 的重要性

ios - 位置管理器 :didEnterRegion and didExitRegion are never getting called :iBeacon