NSURLConnection的委托(NSURLConnection delegate)

2019-07-29 17:58发布

修订...

该应用的症结与数据库服务器通信。 从服务器到应用程序的响应都在XML。 有几个屏幕。 例如,屏幕1只列出了用户的信息,屏幕2只列出了用户过去的交易,让新的交易,等等。

下面是我的AppDelegate一些代码:

StartViewController *svc = [[StartViewController alloc] init];
TradeViewController *tvc = [[TradeViewController alloc] init];
CashViewController *cvc = [[CashViewController alloc] init];
ComViewController *covc = [[ComViewController alloc] init];
PrefsViewController *pvc = [[PrefsViewController alloc] init];

NSMutableArray *tabBarViewControllers = [[NSMutableArray alloc] initWithCapacity:5];
UITabBarController *tabBarController = [[UITabBarController alloc] init];

UINavigationController *navigationController = [[UINavigationController alloc] initWithRootViewController:svc];
[tabBarViewControllers addObject:navigationController];
navigationController = nil;

navigationController = [[UINavigationController alloc] initWithRootViewController:tvc];
[tabBarViewControllers addObject:navigationController];
navigationController = nil;

navigationController = [[UINavigationController alloc] initWithRootViewController:cvc];
[tabBarViewControllers addObject:navigationController];
navigationController = nil;

navigationController = [[UINavigationController alloc] initWithRootViewController:covc];
[tabBarViewControllers addObject:navigationController];
navigationController = nil;

navigationController = [[UINavigationController alloc] initWithRootViewController:pvc];
[tabBarViewControllers addObject:navigationController];
navigationController = nil;

[tabBarController setViewControllers:tabBarViewControllers];

[[self window] setRootViewController:tabBarController];

self.window.backgroundColor = [UIColor whiteColor];
[self.window makeKeyAndVisible];

试图坚持使用MVC的风格,我有一个单例类,做所有的“处理”的。

现在,我如何碰壁的例子......用户可以在屏幕上5改变他们的电子邮件地址输入新的电子邮件地址转换成文本字段,然后单击保存按钮。 然后,将按钮调用从它发送新的电子邮件地址到服务器并(通过URL),并接收XML响应,确认改变的单例类的方法。

这里是我的问题:1。我做单例类方法调用之前,我开始从视图控制器的微调 - 但不知道什么时候该应用服务器发送/接收完成后,如何让我在正确的时间微调停止? 我不能从单个类的话,我试过了。 据我所知,它必须是从VC中还是有办法从我的单例类改变VC的输出?

  1. 单例类NSURLConnection的处理所有我沟通。 从一个简单的电子邮件一切都改变一路更新事务表。 这完全是我错了,并使它很难跟踪谁在叫什么。 同样,我对我的MVC的解释去。 我认为这将是更容易对每一个VC和NSURLConnection的这些类中做一些处理。 但是这不会是MVC(ISH)。

  2. 我有接近100个变量,数组等等......在我,我用赋值给我所有的VC单例类。 这也似乎是错误的我,但我想不出任何其他方式。

Answer 1:

我怎么能在NSURLConnection的委托(connectionDidFinishLoading)的URL呼叫正在取得什么区别?

每个委托方法(如-connectionDidFinishLoading:具有connection ,告诉你哪个连接发送的消息参数。 给定的连接只能在同一时间加载一个URL,所以有一个URL和连接之间一一对应。

我怎么能告诉“connectionDidFinishLoading”之外完成下载时?

该方法告诉你,当连接完成。 这是给你的地方存储信息的地方是给你的应用程序非常有用。

更新:根据您所添加的是什么,你的“处理”类应用的典范。 该应用程序的其余部分不应该关心每个交易涉及的消息到服务器 - 这是单独模型的业务。 此外,没有任何理由,该模型是一个单一的对象(更不用说单) - 它可以是一组协同工作的对象。

所以,你可能有一个类(我们称之为处理器),代表应用程序的界面模型(有人甚至称之为“模型控制器”)。 处理器的一个实例可以用于存储app.You目前当地国家也可能有一个代表与服务器的单个交易的交易类来创建一个本地数据库。 事务可以创建一个请求,将其发送到服务器,得到响应,更新数据库,并告诉该交易完成处理器。 或者,也许当应用程序的其它部分(如您的视图控制器之一)要求的处理器来处理新的事务,处理器通过请求对象一起,它创建使交易可以直接更新请求交易。

很难说什么你的应用程序的最佳方案是不知道你打算把它在那里,但通常的准则举行:

  • 打破你的问题到是比较容易解决的部分

  • 限制每个类的职责范围

  • 如果事情似乎复杂,它可能是

打破你的模型分成几类将使其更容易测试,以及。 你可以想象这将是多么容易编写了一套单元测试Transaction类。 这同样适用于处理器 - 如果服务器交易的东西是不同的类,它更容易测试,该处理器是做正确的事。



Answer 2:

如果您有相同的委托多个NSURLConnections,可以考虑使用一个全球性的(当然,假设而不是一个实例变量)的NSMutableDictionary实例,您在其中存储数据,这取决于NSURLConnection的将被调用。 您可以使用,例如,在连接的内存地址转换成一个NSString(像

[NSString stringWithFormat:@"%p", connection]

应该做的伎俩)。

另外,在connectionDidFinishLoading:connection:didFailLoadWithError:方法,删除对应于该NSURLConnections的键。 只是检查它是否在字典或不:因此,你可以从“外部”如果连接完成后告诉它。



Answer 3:

如果您正在下载通过网络连接的任何数据,我建议使用ASIHttpRequest 。 这将允许您异步下载文件,这意味着你的界面在下载过程中不结冰。

如果你使用ASIHttpRequest ,您还可以设置didFinishSelector 。 通过这样做,你可以控制哪些方法在特定的URL完成加载时调用。

看看这个:

NSURL *url = [NSURL URLWithString:@"http://allseeing-i.com"];
ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];

[request setDelegate:self];
[request startAsynchronous];
[request setDidFinishSelector:@selector(requestDone:)];

然后:

- (void)requestDone:(ASIHTTPRequest *)request
{
   // Use when fetching text data
   NSString *responseString = [request responseString];

   // Use when fetching binary data
   NSData *responseData = [request responseData];

   // If you want, you can get the url of the request like this
   NSURL *url = [request url];
}

至于你的问题的第二部分,如果requestDone:方法还没有被调用,你知道尚未下载完成。

如果你想要做一些更复杂的多下载, ASIHttpRequest提供队列功能了。 看看这里 。



Answer 4:

希望这会帮助你。

- (void)connectionDidFinishLoading:(NSURLConnection*)connection
{   
    NSString *urlString = [[[connection originalRequest] URL] absoluteString];
    if ([urlString caseInsensitiveCompare:@"http://www.apple.com"] == NSOrderedSame) {
        //Do Task#1
    }
    else if ([urlString caseInsensitiveCompare:@"http://www.google.com"] == NSOrderedSame)
    {
        //Do Task#2
    }
}


Answer 5:

我会建议子类NSURLConnection的。 只需添加两个属性:一个NSInteger, tag和BOOL, isFinished 。 通过这种方式,你可以#define标签为每个不同的请求,然后在你的委托方法通过标签识别它们。 在connectionDidFinishLoading ,您可以设置isFinished BOOL到YES,那么您可以在其他的方法,如果再连接完成检查。


下面是我自己的NSURLConnection的子类,TTURLConnection:

TTURLConnection.h:

#import <Foundation/Foundation.h>

@interface TTURLConnection : NSURLConnection <NSURLConnectionDelegate>

@property (nonatomic) NSInteger tag;
@property (nonatomic) BOOL isLocked;

- (id)initWithRequest:(NSURLRequest *)request delegate:(id)delegate startImmediately:
    (BOOL)startImmediately tag:(NSInteger)tagParam;

@end

TTURLConnection.m:

#import "TTURLConnection.h"

@implementation TTURLConnection

@synthesize tag;

- (id)initWithRequest:(NSURLRequest *)request delegate:(id)delegate startImmediately:
    (BOOL)startImmediately tag:(NSInteger)tagParam {
    self = [super initWithRequest:request delegate:delegate 
        startImmediately:startImmediately];

    if(self) {
        self.tag = tagParam;
    }

    return self;
}

@end


文章来源: NSURLConnection delegate