发表于: 2017-01-08 02:23:59

2 898


今天完成的事情:网络请求前辈给我的网址上的JSON数据,并解析成字典格式输出.了解NSURLSession和它的三个子类.

明天的计划:希望能把解析出的字典创建一个model,并用UITableView显示到屏幕上.

遇到的问题:问题主要还是在怎么创建model上,网上找的资料基本都是如何使用第三方创建model的框架,要么是swift写的.还没有找到可以看懂的.需要继续搜索.

收获:

网络请求

首先创建一个URL放要请求的地址

NSURL *url = [NSURL URLWithString:@"要请求的网址"];

然后把网址放到请求方法中

NSURLRequest *request = [NSURLRequest requestWithURL:url];

建立会话

NSURLSession *session = [NSURLSession sharedSession];

//通过数据会话方法解析网站JSON数据

NSURLSessionDataTask *task = [session dataTaskWithRequest:request completionHandle:^(NSData *data,NSURLResponse *response, NSError *error){

//解析JSON数据并传入字典

NSDictionary *dit = [NSJSONSerialization JSONObjectWithData:data options:kNiloptions error:nil];

}];

启动任务

[task resume];

这样就能把网站上的JSON数据用字典装起来了.


子类NSURLSessionUploadTask

前面基本上都一样

NSURL *url = [NSURL URLWithString:@"网址"];

NSURLRequest *request = [NSURLRequest requestWithURL:url];

NSData *data = 一个要上传的NSData对象或一个本地文件路径对应的URL;

NSURLSession *session = [NSURLSession sharedSession];

NSURLSessionUploadTask *upload = [session uploadTaskWithRequest:request fromData:data completHandler:^(NSData *data ,NSURLResponse *response,NSError *error){}];//代码块中的放什么我还不知道

[task resume];


NSURLSessionDownloadTask 

NSURL *url = [NSURL URLWithString:@"网址"];

NSURLRequest *request = [NSURLRequest requestWithURL: url];

NSURLSession *session = [NSURLSession sharedSession];

NSURLSessionDownloadTask *down  = [session downloadTaskWithRequest:request completHander:^(NSURL *location, NSURLResponse *response,NSError *error){

location是沙盒中tmp文件夹中的一个临时url,文件下载后会存到这个位置,由于tmp的文件随时可能被删除,所以需要把下载的文件挪到需要的地方.

NSString *path = [[NSSearchPathForDirectioniesInDomains(NSCachesDirectory,NSUserDomainMake,YES)lastObject] stringByAppendingPathComponent:response.suggestedFilename];

剪切文件

[[NSFileManager defaultManager] moveItemAtURL;location toURL:[NSURL fileURLWithPath:path] error:nil];}];

[task resume];

response.suggestedFilename是从相应文件中取出服务器储存路径的最后一个部分.



NSURLSessionDataDelegate代理方法

使用代理方法需要设置代理,但是session的delegate属性是只读的所以创建session的方式和前面的有所不同

NSURLSession *session = [NSURLSession sessionWithConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration] delegate:self delegateQueue:[[NSOpertionQueue alloc] init];

创建任务

NSURLSessionDataTask *task = [session dataTaskWithRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:@"网址"]]];

启动任务

[task resume];


对应代理方法如下:

1.接受到服务器响应

-(void)URLSession:(NSURLSessioin *)session dataTask:(NSURLSessionDataTask *)dataTask didReceiverResponse:(NSURLResponse *)response completionHandler:(void (^)(NSURLSessionResponseDisposition))completionHandler{

允许处理服务器响应,才会继续接受服务器返回的数据(访问成功会返回,失败什么都不返回)


2.接收服务器的数据(可能调用多次)

-(void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didReceiveData:(NSData *)data{处理每次接受数据}


3.请求成功或者失败(如果失败error有值)

-(void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didCompleteWithError:(NSError *)error{

请求完成,成功或者失败处理(只会在访问失败时返回)


这些代理方法我都用NSLog试过,具体什么状况能调用到明白,在往深操作我就不会了.modelmodelmodel.





返回列表 返回列表
评论

    分享到