发表于: 2017-01-08 02:23:59
2 1070
今天完成的事情:网络请求前辈给我的网址上的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.
评论