作为一只没有节操的程序猿,越发理解分享是多么重要的事情;因此以后会把工作和学习中遇到的问题和技巧分享上来,万一被哪位程序媛或者程序猿看上了呢?
好了,回归正题,今天在创建的时候,小手一抖,引出了今天要讲的话题: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是你的首选.不过要注意去掉字符串中的协议头;
好了,第一篇就就先这样吧,试笔之作,希望大家多多指正,定当虚心接受;