问题:
一:如何取消一个添加到 NSOperationQueue 中的 NSOperation (或说 task ).
二:block?
三:如何通过http协议获取返回文件的总大小。
四:NSURLConnectionDelegate 几个总要的方法。
五:查询字符方法。
六:文件操作。
七: 断点续传时,返回的数据 content-range 有一个很大偏移量,本来这个偏移量是取本地的临时文件,但是第一次下载这个临时文件是不存在的,也就说,偏移量应该时从 0 开始下载?
八:继承于 AFURLConnectionOperation 的类调用 setCompletionBlock 失败。
回答:
一:继承一个NSOperation, 然后给其加上一个标识,通过这个标识来区分是否是自己需要找的那个 NSOperation. 然后调用 cancel 操作。但是个人感觉这样遍历的时候或许有潜在风险。官方也没有这方面的指导,只是说加入到 NSOperationQueue
中的NSOperation是不可以删除但是可以取消,具体如何取消没有给出详细的指导建议。
二:1:block 要注意这个block是那个线程执行;
2:使用那个变量。
3:格式:
声明: returnType (^blockName)(parameterTypepara1, parameterType para2, … )
声明类型:typedef returnType(^blockTypeName)(parameterType para1, parameterType para2, … )
作为参数传递类型:returnType (^)(parameterType para1,parameterType para2, … )
三:如何通过http协议获取返回文件的总大小。
如果使用的是 get 方式, range 的请求头,那么文件的总大小是返回 206 协议头 "Content-Range" ="bytes a-b/c"; c 就是我们取的值
如果使用 url 带参数来模拟 range 方式下载,不会返回206 状态码,只会返回200,这个时候总大小就是 content-length + 已请求完成的数据大小(比如纪录在 本地文件 或 缓存)
四:NSURLConnectionDelegate 几个总要的方法。
- (void)connection:(NSURLConnection*)connection didReceiveResponse:(NSURLResponse *)response
如果使用的是http协议,那 response 返回的就是 NSHTTPURLResponse,拖过这个就可以获取头信息。
- (void)connection:(NSURLConnection*)connection didReceiveData:(NSData *)data
返回的实际下载数据
五:查询字符方法。
subStringRange:(NSRange) rng;
注意NSRange里面的 location 是指定开始位置是从 0 开始算的
查询文件大小(通过 字典 或 数组 方式查询):
NSDictionary*fileDict = [NSFileManager new] 或 [NSFileManagerdefaultManager] attributesOfItemAtPath:path error:&error];
signedlong long fileSize = [fileDict fileSize];
NSString*contentRange = [httpResponse.allHeaderFieldsvalueForKey:@"Content-Range"];
NSArray*bytes = [contentRange componentsSeparatedByCharactersInSet:[NSCharacterSetcharacterSetWithCharactersInString:@" -/"]]; //注意查询字符集还有一个空格
longlong totalContenLength= [[bytes[3] longLongValue];
六:文件操作
//裁减或扩充文件到指定的偏移位置,注意,扩充的时候填充 0
NSFileHandle*file = [NSFileHandle fileHandleForWritingAtPath:_targetPath];
[filetruncateFileAtOffset:_offsetContentLength];
[filecloseFile];
//获取文件大小
[[NSFileManagerdefaultManager/new] attributesOfItemAtPath:targetPath error:nil] fileSize];
//判断文件是否存在 或 是否为目录
BOOL isDir= NO;
BOOLisExist = [NSFileManagerdeafultManager/new] fileExistsAtPath: _targetPath isDirectory:&isDir];
//获取文件的内容
NSString*fileContent = [[NSString alloc]initWithData:[[NSFileManager defaultManager]contentsAtPath:_targetPath] encoding:NSUTF8StringEncoding];
七: 断点续传时,返回的数据 content-range 有一个很大偏移量,本来这个偏移量是取本地的临时文件,但是第一次下载这个临时文件是不存在的,也就说,偏移量应该时从 0 开始下载?
在请求的url最后加上一个不重复的随机数,确保请求的url不一样,造成上述情况猜测可能是由于服务器缓存造成的。
八:继承于 AFURLConnectionOperation 的类调用 setCompletionBlock 失败。
造成出现该问题的原因是由于在调用 initWithRequest 的时候没有调用 [super initWithRequest]