KVO实现自定义文件复制进度效果
程序员文章站
2023-12-18 20:28:52
本文实例为大家分享了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]; }
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。