搞iOS開發(fā)應(yīng)該都知道AFNetworking這個優(yōu)雅的網(wǎng)絡(luò)請求庫,基本上我們搞app基本上要跟網(wǎng)絡(luò)打交道,基本上我們也會用到AFNetworking這個網(wǎng)絡(luò)庫,如果你使用的是Swift語言開發(fā)的那你使用的也是同一個作者開發(fā)的另一個網(wǎng)絡(luò)請求庫Alamofire,AFNetwork 的前綴 AF 是 Alamofire 的縮寫,因此這個新的庫名稱其實是根據(jù) Swift 的約定來進行命名的。接下來我會把我在開發(fā)中使用AFN遇到的一些問題列出來。
使用AFN遇到的那些問題
1、處理返回數(shù)據(jù)時出現(xiàn)Error Domain=NSCocoaErrorDomain Code=3840 錯誤,報錯:
Error Domain=NSCocoaErrorDomain Code=3840 "The operation couldn’t be completed. (Cocoa error 3840.)" (Unescaped control character around character 2884.) UserInfo=0x79fa60b0 {NSDebugDescription=Unescaped control character around character 2884.}
原因在于出現(xiàn)特殊字符是AFNetworking無法解析的,會直接報錯,那么當(dāng)你在發(fā)post請求時,返回結(jié)果會直接進如fail代碼塊,其實在fail中用operation的nsstring可以直接輸出接收到的數(shù)據(jù),是string形,可以清楚的看到服務(wù)器端數(shù)據(jù)有哪些含有特殊字符,但是有一些字符是不好看到的,比如“TAB”(制表)鍵打出的那種四個空格,項目中用戶有時候很常用到tab鍵,最好的方法是在AFNetworking源碼中添加字符過濾功能
處理辦法:找到AFNetworking包中AFURLResponseSerialization.m文件,大概在第256行的 if (responseString && ![responseStringisEqualToString:@" "])(此時已將data轉(zhuǎn)化為responseString形)條件下面添加如下過濾方法:
NSCharacterSet *controlChars = [NSCharacterSet controlCharacterSet];
NSRange range = [responseString rangeOfCharacterFromSet:controlChars];
if (range.location != NSNotFound)
{
NSMutableString *mutable = [NSMutableString stringWithString:responseString];
while (range.location != NSNotFound)
{
[mutable deleteCharactersInRange:range];
range = [mutable rangeOfCharacterFromSet:controlChars];
}
responseString = mutable;
} ```
OK,再試一下,應(yīng)該不會在報錯了。
參考網(wǎng)址[鏈接](http://blog.csdn.net/atomgirl/article/details/43154483)
****
2、AFNetworking請求數(shù)據(jù),我們會對AFN進行封裝再使用或者直接使用,當(dāng)我們使用時
- (NSMutableArray *)createRequestWithUrlString:(NSString *)string
{
_dataArr = [[NSMutableArray alloc]init];
AFHTTPRequestOperationManager *manger = [AFHTTPRequestOperationManager manager];
manger.responseSerializer = [AFHTTPResponseSerializer serializer];
[manger GET:string parameters:nil success:^(AFHTTPRequestOperation *operation, id responseObject){
if (operation.responseData)
{
NSDictionary *result = [NSJSONSerialization JSONObjectWithData:operation.responseData options:NSJSONReadingMutableContainers error:nil];
NSArray *resultArr = [result objectForKey:@"news"];
for (NSDictionary *dict in resultArr)
{
TopModel *model = [[TopModel alloc]init];
[model assinWithDict:dict];
[_dataArr addObject:model];
}
[self reloadData];
}
} failure:^(AFHTTPRequestOperation *operation, NSError *error) { NSLog(@"error = %@",error); }];
return _dataArr;
}```
請求數(shù)據(jù)總是直接跳出來,返回的內(nèi)容為空,我們應(yīng)該做的是在解析下面加一個reloaData方法,這樣返回的內(nèi)容就不會為空了,F(xiàn)Networking請求數(shù)據(jù)的時候直接return。無數(shù)據(jù)返回。因為是異步請求。主線程優(yōu)先 return _dataArr; 放在Success里面試試 這樣應(yīng)該可以,異步請求會先return掉得,放在success里 就不一樣了。當(dāng)我們使用dispatch_group 成組操作的時候我們可以在dispatch_group_notify方法中刷新視圖,這樣就不會無數(shù)據(jù)顯示。
3、AFNetWorking 3.0在CocoaPods上的坑,當(dāng)我們使用AFN的3.0的版本的時候,我們使用podfile的時候會出現(xiàn)問題,使用pod search 方法你會發(fā)現(xiàn)AFN在CocoaPods沒有3.0版本,可能原因是AFN更新太快CocoaPods沒有同步跟新過來,具體方法和原因我是參考這篇文章解決問題的鏈接。
4、使用AFN中的AFHTTPSessionManager對象調(diào)用請求GET方法后,一直沒有被釋放,因為它一直強引用著session即NSURLSession對象,而session一直被session的delegate強引用著,這樣就造成了循環(huán)引用導(dǎo)致內(nèi)存泄漏。當(dāng)我對AFN封裝使用,檢測APP發(fā)現(xiàn)有內(nèi)存泄漏問題,這個問題很早以前就有人在Github上提過了,@mattt當(dāng)時也回復(fù)了這里.這個問題你也可以在stackoverflow搜索基本可以解決你的問題,我查看的網(wǎng)址是鏈接,作者還在最后給出了他封裝的AFN3.0庫讓你可以安全的使用具體詳情可以去查看上面我給出的鏈接。
最后
本人水平有限如果哪里有地方寫錯或者寫的不好,還望大家及時指出我會盡快修改,以免誤導(dǎo)他人,如果上面哪個有更好的解決方法還望無私分享,大家溝通交流一起學(xué)習(xí)。