作為一只沒有節(jié)操的程序猿,越發(fā)理解分享是多么重要的事情;因此以后會把工作和學習中遇到的問題和技巧分享上來,萬一被哪位程序媛或者程序猿看上了呢?
好了,回歸正題,今天在創(chuàng)建的時候,小手一抖,引出了今天要講的話題:fileURLWithPath與 URLWithString的區(qū)別;
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創(chuàng)建下載任務的方法,重點在于小手抖出來[NSURL URLWithString:fullPath]的URL創(chuàng)建方法后,在Cache文件夾下始終沒有得到要下載的圖片,后來把[NSURL URLWithString:fullPath]改為[NSURL fileURLWithPath:fullPath]后,下載的圖片才嬌羞呈現(xiàn);
因此整理了一下這兩種創(chuàng)建URL方法的區(qū)別;
首先我們要分清楚URL和路徑是不同的概念;URL是包含協(xié)議頭 + 主機地址 +資源路徑,如果訪問的資源是本機的,那么主機地址可以省略;而路徑是不用包含協(xié)議頭和主機地址的;各位客官請過目下面的測試:
- (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];//無法生成 —>路徑中不能包含協(xié)議頭
//??? [dict writeToURL:url1 atomically:YES];//可以生成
//??? [dict writeToURL:url2 atomically:YES];//可以生成
[dict writeToURL:url3 atomically:YES];//無法生成 —>字符串中必須包含協(xié)議頭,不然生成的URL是錯誤的;
}
打印出的結果:url1 = file:///Users/calabashBoy/Desktop/name.plist
url2 = file:///Users/calabashBoy/Desktop/name.plist
url3 = /Users/calabashBoy/Desktop/name.plist
可以看出來使用fileURLWithPath創(chuàng)建出來的URL會自動加上協(xié)議頭file://;
而使用URLWithString創(chuàng)建的URL,與原有的字符串一模一樣;
那么當我們需要根據一個字符串創(chuàng)建URL的時候,如果這個字符串包含協(xié)議頭,那么使用URLWithString,一般用于網絡資源的URL創(chuàng)建;
如果訪問的是本地資源,而且不包含協(xié)議頭,使用fileURLWithPath創(chuàng)建URL;當然可以用URLWithString拼接一個協(xié)議頭來實現(xiàn),不過這….耿直如你;
另外在使用fileURLWithPath創(chuàng)建URL時,不用擔心URL中混有中文的問題,系統(tǒng)會自動實現(xiàn)轉換;
因此如果在訪問本地資源的時候,不要猶豫,fileURLWithPath是你的首選.不過要注意去掉字符串中的協(xié)議頭;
好了,第一篇就就先這樣吧,試筆之作,希望大家多多指正,定當虛心接受;