// 1.創建AFN管理者 // AFHTTPRequestOperationManager內部包裝了NSURLConnection AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager]; //
2.利用AFN管理者發送請求NSDictionary *params = @{ @"username" : @"520it", @"pwd" : @"520it" }; [manager GET:@"http://120.25.226.186:32812/login" parameters:params success:^(AFHTTPRequestOperation *operation, id responseObject) { //
注意點: 如果服務器返回的是JSON, AFN會自動轉換爲OC對象 NSLog(@"請求成功---%@", responseObject); } failure:^(AFHTTPRequestOperation *operation, NSError *error) {NSLog(@"請求失敗---%@", error); }];
POST
// 1.創建AFN管理者
// AFHTTPRequestOperationManager內部包裝了NSURLConnection
AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
// 2.利用AFN管理者發送請求
NSDictionary *params = @{
@"username" : @"520it",
@"pwd" : @"520it"
};
[manager POST:@"http://120.25.226.186:32812/login" parameters:params success:^(AFHTTPRequestOperation *operation, id responseObject) {
NSLog(@"請求成功---%@", responseObject);
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
NSLog(@"請求失敗---%@", error);
}];
```##NSURLSession包裝方法###GET```objc
// 1.創建AFN管理者
AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
// 2.利用AFN管理者發送請求
NSDictionary *params = @{
@"username" : @"520it",
@"pwd" : @"520it"
};
[manager GET:@"http://120.25.226.186:32812/login" parameters:params success:^(NSURLSessionDataTask *task, id responseObject) {
NSLog(@"請求成功---%@", responseObject);
} failure:^(NSURLSessionDataTask *task, NSError *error) {
NSLog(@"請求失敗---%@", error);
}];
POST
// 1.創建AFN管理者
AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
// 2.利用AFN管理者發送請求
NSDictionary *params = @{
@"username" : @"520it",
@"pwd" : @"520it"
};
[manager POST:@"http://120.25.226.186:32812/login" parameters:params success:^(NSURLSessionDataTask *task, id responseObject) {
NSLog(@"請求成功---%@", responseObject);
} failure:^(NSURLSessionDataTask *task, NSError *error) {
NSLog(@"請求失敗---%@", error);
}];
文件下載
// 1.創建AFN管理者
AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
// 2.利用AFN管理者發送請求
NSURLRequest *reuqest = [NSURLRequest requestWithURL:[NSURL URLWithString:@"http://120.25.226.186:32812/resources/videos/minion_02.mp4"]];
[[manager downloadTaskWithRequest:reuqest progress:nil destination:^NSURL *(NSURL *targetPath, NSURLResponse *response) {
// targetPath: 已經下載好的文件路徑
NSLog(@"targetPath = %@", targetPath);
NSString *path = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) firstObject];
NSURL *documentsDirectoryPath = [NSURL fileURLWithPath:[path stringByAppendingPathComponent:response.suggestedFilename]];
// 返回需要保存文件的目標路徑
return documentsDirectoryPath;
} completionHandler:^(NSURLResponse *response, NSURL *filePath, NSError *error) {
NSLog(@"filePath = %@", filePath);
}] resume];
監聽進度
要跟蹤進度,需要使用 NSProgress,是在 iOS 7.0 推出的,專門用來跟蹤進度的類!// 下載時監聽進度- (void)download2{
// 1. 創建AFNetworking管理者
AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
// 2. 利用AFNetworking管理者發送請求
NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:@"http://120.25.226.186:32812/resources/videos/minion_02.mp4"]];
// 3.創建NSProgress
NSProgress *progress = nil;
self.progress = progress;
// 4. 創建下載任務
NSURLSessionDownloadTask *task = [manager downloadTaskWithRequest:request progress:&progress destination:^NSURL *(NSURL *targetPath, NSURLResponse *response) {
// 文件移動到caches目錄
NSString *path = [response.suggestedFilename cacheDir];
// 獲取文件的URL地址
NSURL *destURL = [NSURL fileURLWithPath:path];
// 返回URL地址
return destURL;
} completionHandler:^(NSURLResponse *response, NSURL *filePath, NSError *error) {
NSLog(@"filePath = %@", filePath);
}];
// 5. 給NSProgress註冊監聽, 監聽它的completedUnitCount屬性的改變
/* NSProsess屬性: @property int64_t totalUnitCount; 總大小 @property int64_t completedUnitCount; 完成大小 */
[progress addObserver:self forKeyPath:@"completedUnitCount" options:NSKeyValueObservingOptionNew context:nil];
[task resume];}- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context{
if ([object isKindOfClass:[NSProgress class]]) {
NSProgress *progress = (NSProgress *)object;
// 計算下載進度
NSLog(@"%f", 1.0 * progress.completedUnitCount / progress.totalUnitCount);
}}- (void)dealloc{
[self removeObserver:self.progress forKeyPath:@"completedUnitCount"];}
文件上傳
// 1.創建AFN管理者
AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
// 2.利用AFN管理者發送請求
[manager POST:@"http://120.25.226.186:32812/upload" parameters:@{@"username" : @"lnj"} constructingBodyWithBlock:^(id<AFMultipartFormData> formData) {
NSData *data = [NSData dataWithContentsOfFile:@"/Users/NJ-Lee/Desktop/Snip20150811_1.png"];
// name : 服務器對應的數據參數
[formData appendPartWithFileData:data name:@"file" fileName:@"lnj.png" mimeType:@"image/png"];
} success:^(NSURLSessionDataTask *task, id responseObject) {
NSLog(@"請求成功---%@", responseObject);
} failure:^(NSURLSessionDataTask *task, NSError *error) {
NSLog(@"請求失敗---%@", error);
}];
[formData appendPartWithFileURL:[NSURL fileURLWithPath:@"/Users/NJ-Lee/Desktop/Snip20150811_1.png"] name:@"file" fileName:@"lnj.png" mimeType:@"image/png" error:nil];
最好用
[formData appendPartWithFileURL:[NSURL fileURLWithPath:@"/Users/NJ-Lee/Desktop/Snip20150811_1.png"] name:@"file" error:nil];
-
AFN解耦
- 自定義單利類繼承Manager
- 優點: 替換框架只需要求改單利類即可
-
序列化
- AFN默認將服務器返回的數據當做JSON處理, 會自動解析
- manager.responseSerializer = [AFJSONRequestSerializer serializer];
- 告訴AFN,以XML形式解析服務器返回的數據
- manager.responseSerializer = [AFXMLParserResponseSerializer serializer];
- 告訴AFN, 不處理服務器返回的數據, 原樣返回
- manager.responseSerializer = [AFHTTPResponseSerializer serializer];
-
主要用於存儲對象狀態爲另一種通用格式,比如存儲爲二進制、xml、json等等,把對象轉換成這種格式就叫序列化,而反序列化通常是從這種格式轉換回來。
-
使用序列化主要是因爲跨平臺和對象存儲的需求,因爲網絡上只允許字符串或者二進制格式,而文件需要使用二進制流格式,如果想把一個內存中的對象存儲下來就必須使用序列化轉換爲xml(字符串)、json(字符串)或二進制(流)
網絡狀態檢測
- AFN
// 1.創建網絡監聽對象
AFNetworkReachabilityManager *manager = [AFNetworkReachabilityManager sharedManager]; // 2.設置網絡狀態改變回調 [manager setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) { /*AFNetworkReachabilityStatusUnknown = -1, // 未知AFNetworkReachabilityStatusNotReachable = 0, // 無連接AFNetworkReachabilityStatusReachableViaWWAN = 1, // 3G 花錢AFNetworkReachabilityStatusReachableViaWiFi = 2, // 局域網絡,不花錢 */ switch (status) { case 0: NSLog(@"無連接"); break; case 1: NSLog(@"3G 花錢"); break; case 2: NSLog(@"局域網絡,不花錢"); break; default: NSLog(@"未知"); break; } }]; // 3.開始監聽 [manager startMonitoring];
蘋果自帶
-
(void)viewDidLoad { [super viewDidLoad]; // 註冊通知 [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(getNetworkStatus) name:kReachabilityChangedNotification object:nil]; // 開始監聽網絡self.reachability = [Reachability reachabilityForInternetConnection];[self.reachability startNotifier];}- (void)dealloc{ [[NSNotificationCenter defaultCenter] removeObserver:self]; [self.reachability stopNotifier];}- (void)getNetworkStatus{ if ([Reachability reachabilityForLocalWiFi].currentReachabilityStatus != NotReachable) {NSLog(@"wifi"); }else if ([Reachability reachabilityForInternetConnection].currentReachabilityStatus != NotReachable) { NSLog(@"手機自帶網絡"); }else { NSLog(@"沒有網絡"); }}
圖片下載
- 重複下載問題
- 定義字典保存下載好的圖片
- 磁盤緩存問題
- 內存沒有嘗試從磁盤獲取
- 阻塞主線程問題
- 新建NSOperationQueue下載圖片
- 重複設置問題
- reloadRowsAtIndexPaths
邏輯
1
- 從來沒下載過 1.查看內存緩存是否有圖片 2.查看磁盤緩存是否有圖片 3.查看時候有任務正在下載當前圖片 4.開啓任務下載圖片 5.寫入磁盤 6.緩存到內存 7.移除下載操作 8.顯示圖片 邏輯2 - 已經下載過 1.查看內存緩存是否有圖片 2.查看磁盤緩存是否有圖片 3.使用磁盤緩存 4.將圖片緩存到內存中 5.更新UI 邏輯3 - 已經下載過, 並且不是重新啓動 1.查看內存緩存是否有圖片 2.更新UI
目錄結構:
-
Documents
- 需要保存由"應用程序本身"產生的文件或者數據,例如:遊戲進度、塗鴉軟件的繪圖
- 目錄中的文件會被自動保存在 iCloud
- 注意:不要保存從網絡上下載的文件,否則會無法上架!
-
Caches
- 保存臨時文件,"後續需要使用",例如:緩存圖片,離線數據(地圖數據)
- 系統不會清理 cache 目錄中的文件
- 就要求程序開發時,"必須提供 cache 目錄的清理解決方案"
-
Preferences
- 用戶偏好,使用 NSUserDefault 直接讀寫!
- 如果要想數據及時寫入磁盤,還需要調用一個同步方法
-
tmp
- 保存臨時文件,"後續不需要使用"
- tmp 目錄中的文件,系統會自動清理
- 重新啓動手機,tmp 目錄會被清空
- 系統磁盤空間不足時,系統也會自動清理
-
封裝獲取文件路徑方法
// cache
-
(NSString *)cacheDir{ // 1.獲取cache目錄 NSString *dir = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) lastObject]; return [dir stringByAppendingPathComponent:[self lastPathComponent]];}// document- (NSString *)documentDir { NSString *dir = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject]; return [dir stringByAppendingPathComponent:[self lastPathComponent]];}// tmp- (NSString *)tmpDir { NSString *dir = NSTemporaryDirectory(); return [dir stringByAppendingPathComponent:[self lastPathComponent]];}
SDWebImage架構
-
SDWebImageManager
- SDImageCache
- SDWebImageDownloader
- SDWebImageDownloaderOperation
-
SDWebImage常見面試題
-
默認緩存時間多少
- 一週
-
緩存的地址
- NSString *fullNamespace = [@"com.hackemist.SDWebImageCache." stringByAppendingString:ns];
-
cleanDisk如何清理過期圖片
- 刪除早於過期日期的文件
- 保存文件屬性以計算磁盤緩存佔用空間
- 如果剩餘磁盤緩存空間超出最大限額,再次執行清理操作,刪除最早的文件
-
clearDisk如何清理磁盤
- 刪除緩存目錄
- 新建緩存目錄
-
SDWebImage如何播放圖片
- 取出gif中每一幀, 生成一張可動畫圖片
-
SDWebImage如何判斷圖片類型
- 判斷圖片二進制前8個字節
- kPNGSignatureBytes[8] = {0x89, 0x50, 0x4E, 0x47, 0x0D, 0x0A, 0x1A, 0x0A};
SDWebImage常用方法:
//圖片緩存的基本代碼,就是這麼簡單
[
self
.
image1
sd_setImageWithURL:imagePath1];//用block 可以在圖片加載完成之後做些事情[self.image2 sd_setImageWithURL:imagePath2 completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, NSURL *imageURL) { NSLog(@"這裏可以在圖片加載完成之後做些事情");}];//給一張默認圖片,先使用默認圖片,當圖片加載完成後再替換[self.image1 sd_setImageWithURL:imagePath1 placeholderImage:[UIImage imageNamed:@"default"]];//使用默認圖片,而且用block 在完成後做一些事情[self.image1 sd_setImageWithURL:imagePath1 placeholderImage:[UIImage imageNamed:@"default"] completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, NSURL *imageURL) { NSLog(@"圖片加載完成後做的事情");}];//options 選擇方式[self.image1 sd_setImageWithURL:imagePath1 placeholderImage:[UIImage imageNamed:@"default"] options:SDWebImageRetryFailed];// 直接下載一張圖片 /* 第1個參數: 需要下載圖片的URL 第2個參數: 下載的配置信息(例如是否需要緩存等等) 第3個參數: 下載過程中的回調 第4個參數: 下載完成後的回調 */ NSURL *url = [NSURL URLWithString:@"http://ia.topit.me/a/f9/0a/1101078939e960af9ao.jpg"];[[SDWebImageManager sharedManager] downloadImageWithURL:url options:kNilOptions progress:^(NSInteger receivedSize, NSInteger expectedSize) {// receivedSize : 已經接受到的數據大小 // expectedSize : 需要下載的圖片的總大小NSLog(@"正在下載 %zd %zd", receivedSize, expectedSize); } completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, BOOL finished, NSURL *imageURL) { // image : 下載好的圖片 // error: 錯誤信息 // cacheType: 緩存的類型 // finished: 是否下載完成 // imageURL: 被下載的圖片的地址 NSLog(@"下載成功 %@", image); }];
學習ios 重要還是要理清楚思路 在做或者看老師代碼的時候 自己多想想爲什麼 不要自己看着就抄 另外還是要推薦一下 藍懿IOS這個培訓機構 和劉國斌老師劉國斌老師還是很有名氣的,聽朋友說劉老師成立了藍懿iOS,,老師講課方式很獨特,能夠儘量讓每個人都能弄明白,有的比較難懂的地方,如果有的地方還是不懂得話,老師會換個其它方法再講解,這對於我們這些學習iOS的同學是非常好的,多種方式的講解會理解得更全面,這個必須得給個贊,嘻嘻,還有就是這裏的學習環境很好,很安靜,可以很安心的學習,安靜的環境是學習的基礎,小班講課,每個班20幾個學生,學習氛圍非常好,每天都學到9點多才離開教室,練習的時間很充裕,而且如果在練習的過程中有什麼困難,隨時可以向老師求助,不像其它機構,通過視頻教學,有的甚至學完之後都看不到講師本人,問點問題都不方便,這就是藍懿與其它機構的區別,相信在劉國斌老師的細心指導下,每個藍懿學員都能找到滿意的工作,加油!
-
寫博客第一百零八天;
QQ:565803433