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

2025-05-29 0 88

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

一、创建文件

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

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46
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,并提供方法接口,启动文件拷贝。

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24
- (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];

}

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

收藏 (0) 打赏

感谢您的支持,我会继续努力的!

打开微信/支付宝扫一扫,即可进行扫码打赏哦,分享从这里开始,精彩与您同在
点赞 (0)

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。

快网idc优惠网 建站教程 KVO实现自定义文件复制进度效果 https://www.kuaiidc.com/90673.html

相关文章

发表评论
暂无评论