Iphone 如何在Objective-C中从服务器下载CSV文件

Iphone 如何在Objective-C中从服务器下载CSV文件,iphone,objective-c,ios,xcode,csv,Iphone,Objective C,Ios,Xcode,Csv,我正在开发一个新的iPhone应用程序,在这里我解析了一个来自本地的“csv”文件,它和我一起工作。当我试图以编程方式从服务器下载“csv”文件时,它对我来说并不合适。你能帮帮我吗 从本地文件加载数据(工作正常) 从服务器下载文件(失败) 实施此方法: -(void)connection:(NSURLConnection *)conn didFailWithError:(NSError *)error 你会发现你的错误是 Error Domain=NSURLErrorDomain Code=-

我正在开发一个新的iPhone应用程序,在这里我解析了一个来自本地的“csv”文件,它和我一起工作。当我试图以编程方式从服务器下载“csv”文件时,它对我来说并不合适。你能帮帮我吗

从本地文件加载数据(工作正常)

从服务器下载文件(失败)

实施此方法:

-(void)connection:(NSURLConnection *)conn didFailWithError:(NSError *)error
你会发现你的错误是

Error Domain=NSURLErrorDomain Code=-1000 "bad URL" UserInfo=0xf663f40 {NSUnderlyingError=0xf663de0 "bad URL", NSLocalizedDescription=bad URL}
我以前研究过以这种方式下载信息,我认为您遇到的一个问题是,单独的符号必须用“+”分隔。此外,在提取索引时,不能将“^”符号作为URL的一部分传递。您必须将其替换为“%5E”

因此,添加以下内容:

- (void) connection:(NSURLConnection *)connection didFailWithError:(NSError *)error {
    NSLog(@"%@", [error description]);
}
并将您的URL更改为:

NSString *urlString = @"http://download.finance.yahoo.com/d/quotes.csv?s=^GSPC+^IXIC+^dji+^GSPC+^BVSP+^GSPTSE+^FTSE+^GDAXI+^FCHI+^STOXX50E+^AEX+^IBEX+^SSMI+^N225+^AXJO+^HSI+^NSEI&f=sl1d1t1c1ohgv&e=.csv";
NSURL *url = [NSURL URLWithString:[urlString stringByAddingPercentEscapesUsingEncoding:NSASCIIStringEncoding]];

现在对我有用了!我甚至检查了输出的.csv文件,看起来很好!每行一个完整的报价。

如果您计划通过网络获取比单个csv更多的数据,您可以看看,这是一个用于网络操作的很棒的库

一个可行的解决方案看起来有点像这样:

- (void)getCSVAsynch {
    NSString *unescaped = @"http://download.finance.yahoo.com/d/quotes.csv?s=^GSPC,^IXIC,^dji,^GSPC,^BVSP,^GSPTSE,^FTSE,^GDAXI,^FCHI,^STOXX50E,^AEX,^IBEX,^SSMI,^N225,^AXJO,^HSI,^NSEI&f=sl1d1t1c1ohgv&e=.csv";
    NSURL *url = [NSURL URLWithString:[unescaped stringByAddingPercentEscapesUsingEncoding:NSASCIIStringEncoding]];
    NSURLRequest *request = [NSURLRequest requestWithURL:url];
    AFHTTPRequestOperation *operation = [[AFHTTPRequestOperation alloc] initWithRequest:request];
    [operation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) {
        NSLog(@"CSV: %@", [[NSString alloc] initWithBytes:[responseObject bytes] length:[responseObject length] encoding:NSUTF8StringEncoding]);
    } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
        NSLog(@"Things go boom. %@", [error localizedDescription]);
    }];
    [operation start];
}

数据未进入内部:-“connection didReceiveData”CSVComponents方法是什么?或者,您可以使用stringByAddingPercentEscapesUsingEncoding:NSASCIIStringEncoding对url进行http编码。非常感谢!“现在一切都好了。”巴特凡登德里说得对!可能会使代码更具可读性!将您的更改添加到我的代码中。这太过分了,因为内置的NSURLConnection只需要很少的开销就可以实现他想要的功能。你甚至不必导入任何标题!如果这是他唯一的网络密码,我同意你的看法。如果他的应用程序将通过网络获取更多数据,那么查看AFNetworking可能非常值得。这是很公平的。我倾向于用狭隘的眼光,只关注眼前的问题。:-)
NSString *urlString = @"http://download.finance.yahoo.com/d/quotes.csv?s=^GSPC+^IXIC+^dji+^GSPC+^BVSP+^GSPTSE+^FTSE+^GDAXI+^FCHI+^STOXX50E+^AEX+^IBEX+^SSMI+^N225+^AXJO+^HSI+^NSEI&f=sl1d1t1c1ohgv&e=.csv";
NSURL *url = [NSURL URLWithString:[urlString stringByAddingPercentEscapesUsingEncoding:NSASCIIStringEncoding]];
- (void)getCSVAsynch {
    NSString *unescaped = @"http://download.finance.yahoo.com/d/quotes.csv?s=^GSPC,^IXIC,^dji,^GSPC,^BVSP,^GSPTSE,^FTSE,^GDAXI,^FCHI,^STOXX50E,^AEX,^IBEX,^SSMI,^N225,^AXJO,^HSI,^NSEI&f=sl1d1t1c1ohgv&e=.csv";
    NSURL *url = [NSURL URLWithString:[unescaped stringByAddingPercentEscapesUsingEncoding:NSASCIIStringEncoding]];
    NSURLRequest *request = [NSURLRequest requestWithURL:url];
    AFHTTPRequestOperation *operation = [[AFHTTPRequestOperation alloc] initWithRequest:request];
    [operation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) {
        NSLog(@"CSV: %@", [[NSString alloc] initWithBytes:[responseObject bytes] length:[responseObject length] encoding:NSUTF8StringEncoding]);
    } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
        NSLog(@"Things go boom. %@", [error localizedDescription]);
    }];
    [operation start];
}