当前位置: 移动技术网 > IT编程>移动开发>IOS > KVO实现自定义文件复制进度效果

KVO实现自定义文件复制进度效果

2019年07月24日  | 移动技术网IT编程  | 我要评论

kara组合图片,鹿泉贴吧,江西撞人案被枪决

本文实例为大家分享了kvo实现自定义文件复制进度展示的具体代码,供大家参考,具体内容如下

一、创建文件

说明:自定义文件类,通过nsfilemanager 以及nsfilehandle 实现文件的创建和copy,为了控制内存的并发使用,通过控制每次赋值的固定长度来分多次复制:

nsstring * path=nshomedirectory();
  path =[path stringbyappendingpathcomponent:@"desktop/boby.m"];
  
  nsstring * target=nshomedirectory();
  target =[target stringbyappendingpathcomponent:@"desktop/target.m"];
  
  nsfilemanager * manager=[nsfilemanager defaultmanager];
  
  
  //校验并且创建文件
  if(![manager fileexistsatpath:path]){
    [manager createfileatpath:path contents:nil attributes:nil];
  }
  
  if(![manager fileexistsatpath:target]){
    [manager createfileatpath:target contents:nil attributes:nil];
  }
  nsdictionary * dic=[manager attributesofitematpath:path error:nil];
  
  nsfilehandle * handle=[nsfilehandle filehandleforreadingatpath:path];
  nsfilehandle * handlettarget=[nsfilehandle filehandleforwritingatpath:target];
  
  int total=(int)[dic[@"nsfilesize"] integervalue];
  self.totalsize=total;
  int per=50;
  int count=total%per==0?total/per:total/per+1;
  for(int i=0;i<count;i++){
    
    [handle seektofileoffset:self.nowsize];
    nsdata *data= [handle readdataoflength:per];
    
    int tem=per*(i+1);
    if(tem>total){
      tem=total;
    }

    self.nowsize=tem;
 
    [handlettarget seektoendoffile];
    [handlettarget writedata:data];
    [nsthread sleepfortimeinterval:0.2];
    
  }
  
  [handle closefile];
[handlettarget closefile];

二、设置观察者

说明:自定义使用者,通过设置观察者来动态观察当前文件copy的进度并展示到控制台或者输出到ui,并提供方法接口,启动文件拷贝。

- (id) initwithfile:(filemake *)files{
  self=[super init];
  
  if(self){
    self.file= files;
    [self.file addobserver:self forkeypath:@"nowsize" options:nskeyvalueobservingoptionnew context:nil];
  }
  return self;
}

-(void)observevalueforkeypath:(nsstring *)keypath ofobject:(id)object change:(nsdictionary *)change context:(void *)context{
  cgfloat all=self.file.totalsize;
  cgfloat now=[[change objectforkey:@"new"] floatvalue];
  cgfloat result=now/all; 
  nslog(@"%.2f",result);
  //一定不能忘了销毁当前的观察者
  if(result==1){
    [self.file removeobserver:self forkeypath:@"nowsize"];
  }
}

- (void) begin{
  [self.file startcopy];
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持移动技术网。

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网