ios fileURLWithPath与 URLWithString的区别

本文深入探讨了在iOS开发中,使用fileURLWithPath与URLWithString创建URL的不同之处,特别是它们在处理本地文件路径时的行为差异。通过具体示例,文章解释了如何正确选择和使用这些方法,以确保文件在本地缓存目录中的成功读写。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

https://www.jianshu.com/p/6997fd50f754

作为一只没有节操的程序猿,越发理解分享是多么重要的事情;因此以后会把工作和学习中遇到的问题和技巧分享上来,万一被哪位程序媛或者程序猿看上了呢?

好了,回归正题,今天在创建的时候,小手一抖,引出了今天要讲的话题:fileURLWithPath与 URLWithString的区别;

NSURLSessionDownloadTask*downTask = [sessiondownloadTaskWithURL:url completionHandler:^(NSURL*_Nullablelocation,NSURLResponse*_Nullableresponse,NSError*_Nullableerror) {

NSString*cache =[NSSearchPathForDirectoriesInDomains(NSCachesDirectory,NSUserDomainMask,YES) lastObject];

NSString*fullPath = [cachestringByAppendingPathComponent:fileName];

[[NSFileManagerdefaultManager] moveItemAtURL:location

toURL:[NSURL URLWithString:fullPath] error:nil];

}] resume];

各位犀利的双眼已经看出来这是NSSession创建下载任务的方法,重点在于小手抖出来[NSURL URLWithString:fullPath]的URL创建方法后,在Cache文件夹下始终没有得到要下载的图片,后来把[NSURL URLWithString:fullPath]改为[NSURL fileURLWithPath:fullPath]后,下载的图片才娇羞呈现;

因此整理了一下这两种创建URL方法的区别;

首先我们要分清楚URL和路径是不同的概念;URL是包含协议头 + 主机地址 +资源路径,如果访问的资源是本机的,那么主机地址可以省略;而路径是不用包含协议头和主机地址的;各位客官请过目下面的测试:

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent*)event

{

NSDictionary*dict =@{@"name":@"xiaoqiang"};

NSString*filePath =@"/Users/calabashBoy/Desktop/name.plist";

NSString*fileURL =@"file:///Users/calabashBoy/Desktop/name.plist";

NSURL*url1 = [NSURL URLWithString:fileURL];

NSURL*url2 = [NSURL fileURLWithPath:filePath];

NSURL*url3 = [NSURL URLWithString:filePath];

NSLog(@"url1 = %@\n url2 = %@\n url3 = %@",url1,url2,url3);

//    [dict writeToFile:filePath atomically:YES]; //可以生成

//    [dict writeToFile:fileURL atomically:YES];//无法生成 —>路径中不能包含协议头

//    [dict writeToURL:url1 atomically:YES];//可以生成

//    [dict writeToURL:url2 atomically:YES];//可以生成

[dict writeToURL:url3 atomically:YES];//无法生成 —>字符串中必须包含协议头,不然生成的URL是错误的;

}

打印出的结果:url1 = file:///Users/calabashBoy/Desktop/name.plist

url2 = file:///Users/calabashBoy/Desktop/name.plist

url3 = /Users/calabashBoy/Desktop/name.plist

可以看出来使用fileURLWithPath创建出来的URL会自动加上协议头file://;

而使用URLWithString创建的URL,与原有的字符串一模一样;

那么当我们需要根据一个字符串创建URL的时候,如果这个字符串包含协议头,那么使用URLWithString,一般用于网络资源的URL创建;

如果访问的是本地资源,而且不包含协议头,使用fileURLWithPath创建URL;当然可以用URLWithString拼接一个协议头来实现,不过这….耿直如你;

另外在使用fileURLWithPath创建URL时,不用担心URL中混有中文的问题,系统会自动实现转换;

因此如果在访问本地资源的时候,不要犹豫,fileURLWithPath是你的首选.不过要注意去掉字符串中的协议头;

好了,第一篇就就先这样吧,试笔之作,希望大家多多指正,定当虚心接受;

 


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值