-1

我想请求一个服务器并从它接收 JSON 响应。因为我应该遵循 MVC,所以我正在努力实现这一点(我不知道我应该在 Model 中执行哪种方法以及应该在控制器中执行哪种方法)。

另外我不知道如何在异步请求中将接收到的十六进制值转换为 NSData 或 NSDictionary 。

在此先感谢您的帮助。带有示例代码的流程表示赞赏。我是服务器客户端编程的新手。

4

2 回答 2

1

(通常)不需要为 NSURLConnection 实现委托。绝大多数用例可以利用sendAsynchronousRequest:queue:completionHandler:而不是实现委托(客户端 SSL 身份验证是少数例外之一)。如果您需要对此服务器进行身份验证并且不需要客户端 SSL,请使用 NSURLCredential。同样,无需实现委托,NSURLCredentialStorage 将为您完成所有工作。

创建一个控制器类,使网络请求更新模型。要将您从网络返回的 NSData 转换为对象,请使用 NSJSONSerialization 的JSONObjectWithData:options:error:.

于 2013-07-24T18:43:29.363 回答
0

为了回答您的第一个问题,我会将任何单独的上传或下载操作放到它自己的类中。因此,如果您必须从服务器下载一些 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];
    }
于 2013-07-24T18:32:40.283 回答