在加載網(wǎng)絡圖片(特別是使用SDWebImage加載圖片)時,我們經(jīng)常會遇到圖片緩存失敗的情況,打印url后我們會發(fā)現(xiàn) 字符串中總會有一些不合法的字符(漢字厌小、空格等).
所以加載圖片時要考慮到url處理的問題.
通常情況下,新建一個NSURL的分類重載+ (void)load方法,采用runtime動態(tài)交換方法是最常用的選擇.
+ (void)load {
// 獲取URLWithString:方法的地址
Method URLWithStringMethod = class_getClassMethod(self, @selector(URLWithString:));
// 獲取BMW_URLWithString:方法的地址
Method BMW_URLWithStringMethod = class_getClassMethod(self, @selector(BMW_URLWithString:));
// 交換方法地址
method_exchangeImplementations(URLWithStringMethod, BMW_URLWithStringMethod);
}
+ (NSURL *)BMW_URLWithString:(NSString *)URLString {
NSString *newURLString = [self isChinese:URLString];
return [NSURL BMW_URLWithString:newURLString];
}
//處理特殊字符
+ (NSString *)isChinese:(NSString *)str {
NSString *newString = str;
//遍歷字符串中的字符
for(int i=0; i< [str length];i++){
int a = [str characterAtIndex:i];
//漢字的處理
if( a > 0x4e00 && a < 0x9fff)
{
NSString *oldString = [str substringWithRange:NSMakeRange(i, 1)];
NSString *string = [oldString stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet URLQueryAllowedCharacterSet]];
newString = [newString stringByReplacingOccurrencesOfString:oldString withString:string];
}
//空格處理
if ([newString containsString:@" "]) {
newString = [newString stringByReplacingOccurrencesOfString:@" " withString:@"%20"];
}
//如果需要處理其它特殊字符,在這里繼續(xù)判斷處理即可.
}
return newString;
}
實現(xiàn)以上方法后 調(diào)用URLWithString加載數(shù)據(jù)時,會自動處理漢字和空格,如果需要處理其它特殊字符,只需要在方法后面加上判斷繼續(xù)處理就行了.