我想请求一个服务器并从它接收 JSON 响应。因为我应该遵循 MVC,所以我正在努力实现这一点(我不知道我应该在 Model 中执行哪种方法以及应该在控制器中执行哪种方法)。
另外我不知道如何在异步请求中将接收到的十六进制值转换为 NSData 或 NSDictionary 。
在此先感谢您的帮助。带有示例代码的流程表示赞赏。我是服务器客户端编程的新手。
我想请求一个服务器并从它接收 JSON 响应。因为我应该遵循 MVC,所以我正在努力实现这一点(我不知道我应该在 Model 中执行哪种方法以及应该在控制器中执行哪种方法)。
另外我不知道如何在异步请求中将接收到的十六进制值转换为 NSData 或 NSDictionary 。
在此先感谢您的帮助。带有示例代码的流程表示赞赏。我是服务器客户端编程的新手。
(通常)不需要为 NSURLConnection 实现委托。绝大多数用例可以利用sendAsynchronousRequest:queue:completionHandler:
而不是实现委托(客户端 SSL 身份验证是少数例外之一)。如果您需要对此服务器进行身份验证并且不需要客户端 SSL,请使用 NSURLCredential。同样,无需实现委托,NSURLCredentialStorage 将为您完成所有工作。
创建一个控制器类,使网络请求更新模型。要将您从网络返回的 NSData 转换为对象,请使用 NSJSONSerialization 的JSONObjectWithData:options:error:
.
为了回答您的第一个问题,我会将任何单独的上传或下载操作放到它自己的类中。因此,如果您必须从服务器下载一些 JSON,请创建一个处理该问题的类。如果您还必须将一些客户端数据发送回服务器,请为此创建一个类。
这样做可以更容易地分离您的任务,特别是因为 NSURLConnection 及其委托方法的性质。如果不分开,您将使用大量 if () 块来确定如何处理委托。
我还将自定义类设置为 NSURLConnection 的委托,并为该特定任务定义另一个协议。
例如,如果我有一个将文本上传到服务器并下载几段文本的应用程序,我将有两个类:UploadClass 和 DownloadClass。我会为每个协议创建一个协议,例如 UploadClassProtocol 和 DownloadClassProtocol。每个协议都有几个方法,见下文:
@class UploadClass;
@protocol UploadClassProtocol <NSObject>
-(void)uploadClass:(UploadClass *)upload didReceiveError:(NSError *)error;
-(void)uploadClass:(UploadClass *)upload didPostData:(NSData *)postData;
@end
@interface UploadClass : NSObject <NSURLConnectionDelegate. {
@property (nonatomic, strong) NSURLConnection *uploadConnection;
@property (nonatomic, strong) NSURL *urlForPost;
@property (nonatomic, strong) NSData *postData;
@property (nonatomic, weak) id <UploadClassProtocol> uploadDelegate;
-(id)initWithURL:(NSURL *)url andPostData:(NSData *)postData;
-(void)beginUpload;
@end
//UploadClass.m
@synthesize uploadConnection,urlForPost,postData,uploadDelegate;
-(id)initWithURL:(NSURL *)url andPostData:(NSData *)data;
if ([self = super init]) {
self.urlForPost = url;
self.postData = data;
self.uploadConnection = [[NSURLConnection alloc] init];
uploadConnection.delegate = self;
}
return self;
}
-(void)beginUpload {
//connect your URL to your URLConnection
//set the contents for the post body
//set the http method to POST
//etc
}
//implement URL Connection delegate methods
//delegate method for detecting errors...
if ([uploadDelegate respondsToSelector:@selector(uploadClass:didReceiveError:)]) {
[uploadDelegate uploadClass:self didReceiveError:error];
}
//delegate method for notifying success
if ([uploadDelegate respondsToSelector:@selector(uploadClass:didPostData:)]) {
[uploadDelegate uploadClass:self didPostData:self.postData];
}