//01 URL
NSURL *url = [NSURL URLWithString:@"http://piao.163.com/m/movie/comm_list.html?app_id=1&mobileType=iPhone&ver=2.6&channel=appstore&deviceId=9E89CB6D-A62F-438C-8010-19278D46A8A6&apiVer=6&city=110000"];
//02 构造 Request
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
request.HTTPMethod = @"POST";
request.timeoutInterval = 60;
//Content-Type = application/x-www-form-urlencoded
// [request setValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"Content-Type"];
//设置请求体
//page_size=20&movie_id=43485
NSString *bodyStr = @"page_size=20&movie_id=43485";
request.HTTPBody = [bodyStr dataUsingEncoding:NSUTF8StringEncoding];;
/**
* 方法一,网络请求 在多线程中 ,当数据接收完毕 ,处理的block是在多线程 还是在主线程中运行取决于 queue参数,如果queue是mainqueue,则 数据的处理在主线程中,如果是其他queue则数据处理在多线程中
*/
// //情景一 ,数据的解析处理需要花费很长时间
// NSOperationQueue *queue = [[NSOperationQueue alloc] init];
// [NSURLConnection sendAsynchronousRequest:request queue:queue completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) {
//
// //数据的接收在多线程中,如果 数据的解析时间很长,会阻塞,则数据的解析放在多线程中,刷新UI在主线程中
//
// NSString *jsonStr = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
// [NSThread sleepForTimeInterval:1];
//
// //刷新UI在主线程中
//
// dispatch_sync(dispatch_get_main_queue(), ^{
// _textView.text = jsonStr;
// });
// }];
//
// // 情景二 数据的解析处理时间很短
// [NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) {
// //数据的接收在多线程中,如果 数据的解析时间很短,不阻塞,则直接在主线程中 解析数据 然后刷新 UI
// NSString *jsonStr = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
// _textView.text = jsonStr;
//
/**
*
一 内存优化 :如果缓冲区里面的数据超过500kb则把数据写到文件中
二 断点续传
(1)暂停的时候记录下载的位置
(2)继续下载时,告诉服务器从记录的位置开始传数据
(3)续传数据的时候,把数据写入到文件的末尾
http协议的请求头的设置:
Range : bytes=0-499 表示头500个字节
Range : bytes=500-999 表示第二个500字节
Range : bytes=-500 表示最后500个字节
Range : bytes=500- 表示500字节以后的范围
Range : bytes=0-0,-1 第一个和最后一个字节
*/
- (void)appendFile:(NSData *)data {
//handle能够操作的前提是 文件已经创建
NSFileHandle *handle = [NSFileHandle fileHandleForWritingAtPath:filePath];
//把文件的写位置 定位到 文件末尾
[handle seekToEndOfFile];
[handle writeData:data];
[handle closeFile];
}
//NSUserDefaults 轻量数据保存
- (void)readUserDefaults {
//读取plist文件 ,上一次保存的数据
NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
NSNumber *number = [userDefaults valueForKey:kTotalLen];
totalLength = number.doubleValue;
number = [userDefaults valueForKey:kReceivedLen];
receivedLength = number.doubleValue;
}
- (void)writeUserDefaults {
NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
[userDefaults setValue:@(totalLength) forKey:kTotalLen];
[userDefaults setValue:@(receivedLength) forKey:kReceivedLen];
//把数据同步到文件中
[userDefaults synchronize];
}
- (void)setCompletionBlockWithSuccess:(void (^)(AFHTTPRequestOperation *operation, id responseObject))success
failure:(void (^)(AFHTTPRequestOperation *operation, NSError *error))failure
parameters:(id)parameters
success:(void (^)(AFHTTPRequestOperation *operation, id responseObject))success
failure:(void (^)(AFHTTPRequestOperation *operation, NSError *error))failure;
- (AFHTTPRequestOperation *)GET:(NSString *)URLString
parameters:(id)parameters
success:(void (^)(AFHTTPRequestOperation *operation, id responseObject))success
failure:(void (^)(AFHTTPRequestOperation *operation, NSError *error))failure
NSUrlSession (以后重点使用,iOS9中高要求)