ios 开发随笔

问题:

:如何取消一个添加到 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]

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值