iphone - nsurlconnection异步请求

标签 iphone ios nsurlconnection nsurlrequest nsurlcache

首先,所有的问题都很简单。如果你只是想看看它们是什么,请跳到这篇文章的底部,你会看到它们以粗体显示。要了解更多细节,你可以阅读这篇文章的其余部分...

我只是想解决我的 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 语句)?因为它看起来很像中央调度格式,但略有不同。

问题二: 我应该在 emptyReplytimedOut 方法中做什么?

问题三: 我将如何将缓存合并到其中?我想缓存从不同请求中得到的响应。即使用我的 setRequestString 你会看到有一个字符串输入参数,所以我可以用相同的方法请求不同的 rss 提要..我需要弄清楚如何将这些响应缓存到单独的缓存中..但我不确定从哪里开始

最后 如果您已经做到这一点,非常感谢您阅读我的问题。希望通过您的回复,我们可以在这里得到一个非常好的解决方案。其他人可以自己使用,并挑选他们需要的适用于他们自己的解决方案的位和 peices。

无论如何,非常感谢您的阅读,我期待您的回复。即使它们只是对您认为可能对我有帮助的教程或示例的引用。任何东西都很好,我只是想完全了解发生了什么以及发生了什么一个很好的解决方案。

最佳答案

  1. 阅读 Apple 文档中的 block 。它是新的。或者你可以阅读 here
  2. 您可以显示诸如请求超时等错误。除非您有特殊的逻辑,否则您实际上不必将它们与错误分开处理。
  3. 尝试缓存

    NSURLRequest *urlRequest = [NSURLRequest requestWithURL:url cachePolicy:NSURLRequestReloadIgnoringLocalAndRemoteCacheData timeoutInterval:TIMEOUT_INTERVAL];
    

关于iphone - nsurlconnection异步请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9286849/

相关文章:

ios - 使用 Objective C 从文本字段中输入的文本更改导航栏标题

cocoa-touch - 如何避免 NSUrlConnection 的多个实例的数据损坏

iphone - NSURLConnection 不返回数据

ios - 如何进行经过身份验证的服务调用

javascript - "position:fixed;bottom:0;"在 iPhone 中不起作用

ios - 如何在iphone编程中拆分字符串

javascript - 如何在 iphone uiwebview 中处理 iframe/frames dom

iphone - 减少应用程序大小超过50兆的最佳方法

ios - 带有 UITextField : Trouble with Delegates and Dequequing 的自定义 Xib UITableViewCell

ios - UIPageViewController 手势正在调用 viewControllerAfter : but doesn't animate