欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

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

程序员文章站 2023-12-21 08:09:46
本文实例为大家分享了kvo实现自定义文件复制进度展示的具体代码,供大家参考,具体内容如下 一、创建文件 说明:自定义文件类,通过nsfilemanager 以及ns...

本文实例为大家分享了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];
}

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

上一篇:

下一篇: