首先,所有的问题都很简单。如果你只是想看看它们是什么,请跳到这篇文章的底部,你会看到它们以粗体显示。要了解更多细节,你可以阅读这篇文章的其余部分...
我只是想解决我的 NSURLConnection 问题,以便它能顺利工作,而且我也能正确理解这一点。互联网上非常缺乏异步连接的示例/教程,或者我找不到任何可以解释任何深度级别的示例/教程,除了启动和运行连接之外,这在处理后看起来非常简单。希望这个问题可以填补其他用户的空白。
因此,在我的 .h 文件中,我导入了基础 header 并声明了接收到或缺少接收到的数据(错误等)所需的方法。
.h
#import <UIKit/UIKit.h>
#import <Foundation/Foundation.h> //add foundations
//.. other headers can be imported here
@interface MyViewController: UITableViewController {
//Im not setting any delegates to access the methods because Is all happening in the same
//place so I just use the key word 'self' when accessing the methods declared below
//I'm not sure if this is the best thing to do but I wasn't able to get my head around declaring the delegate or how it would help me with the way I have set up my request etc.
}
- (IBAction)setRequestString:(NSString *)string; //this method sets the request and connection methods
//these methods receive the response from my async nsurlconnection
- (void)receivedData:(NSData *)data;
- (void)emptyReply;
- (void)timedOut;
- (void)downloadError:(NSError *)error;
这就是我的头文件.. 非常简单,不需要太多解释。
.m
//call setRequestString from some other method attached to a button click or something
[self setRequestString:@"rss.xml"];
//..
- (IBAction)setRequestString:(NSString *)string
{
//Set database address
NSMutableString *databaseURL = [[NSMutableString alloc] initWithString:@"http:www.comicbookresources/feeds/"]; // address not real jsut example
//append the string coming in to the end of the databaseURL
[databaseURL appendString:string];
//prepare NSURL with newly created string
NSURL *url = [NSURL URLWithString:databaseURL];
//AsynchronousRequest to grab the data
NSURLRequest *request = [NSURLRequest requestWithURL:url];
NSOperationQueue *queue = [[NSOperationQueue alloc] init];
[NSURLConnection sendAsynchronousRequest:request queue:queue completionHandler:^(NSURLResponse *response, NSData *data, NSError *error)
{
if ([data length] > 0 && error == nil){
[self receivedData:data];
}else if ([data length] == 0 && error == nil){
[self emptyReply];
}else if (error != nil && error.code == NSURLErrorTimedOut){ //used this NSURLErrorTimedOut from foundation error responses
[self timedOut];
}else if (error != nil){
[self downloadError:error];
}
}];
}
现在设置在 .h 文件中初始化并在上面的 if 语句中调用的方法
- (void)receivedData:(NSData *)data
{
NSString* newStr = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
NSLog(@"%@", newStr); //logs recived data
//now you can see what data is coming in on your log
//do what you want with your data here (i.e. start parsing methods
}
- (void)emptyReply
{
//not sure what to do here yet?
}
- (void)timedOut
{
//also not sure what to do here yet?
}
- (void)downloadError:(NSError *)error
{
NSLog(@"%@", error);
UIAlertView *errorAlert = [[UIAlertView alloc] initWithTitle:@"Error!" message:@"A connection failure occurred." delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil, nil];
[errorAlert show];
}
太棒了,我在那里所做的几乎是基础知识..现在我的问题如下。
问题一: 我在哪里调用 NSURLConnection
[NSURLConnection sendAsynchronousRequest:request queue:queue completionHandler:^(NSURLResponse *response, NSData *data, NSError *error)
{
这里发生了什么 ^ 是为了在不同的线程或其他东西上执行整个 block (包括 if 语句)?因为它看起来很像中央调度格式,但略有不同。
问题二: 我应该在 emptyReply 和 timedOut 方法中做什么?
问题三: 我将如何将缓存合并到其中?我想缓存从不同请求中得到的响应。即使用我的 setRequestString 你会看到有一个字符串输入参数,所以我可以用相同的方法请求不同的 rss 提要..我需要弄清楚如何将这些响应缓存到单独的缓存中..但我不确定从哪里开始
最后 如果您已经做到这一点,非常感谢您阅读我的问题。希望通过您的回复,我们可以在这里得到一个非常好的解决方案。其他人可以自己使用,并挑选他们需要的适用于他们自己的解决方案的位和 peices。
无论如何,非常感谢您的阅读,我期待您的回复。即使它们只是对您认为可能对我有帮助的教程或示例的引用。任何东西都很好,我只是想完全了解发生了什么以及发生了什么一个很好的解决方案。
最佳答案
- 阅读 Apple 文档中的 block 。它是新的。或者你可以阅读 here
- 您可以显示诸如请求超时等错误。除非您有特殊的逻辑,否则您实际上不必将它们与错误分开处理。
尝试缓存
NSURLRequest *urlRequest = [NSURLRequest requestWithURL:url cachePolicy:NSURLRequestReloadIgnoringLocalAndRemoteCacheData timeoutInterval:TIMEOUT_INTERVAL];
关于iphone - nsurlconnection异步请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9286849/