一、NSBundle
工程中所有的資源文件
編譯文件
二、上傳圖片到服務器
項目:upload0509
1.客戶端和服務端以二進制流的形式進行交互
2.上傳圖片,顯然是用POST方式
NSURL *url = [NSURL URLWithString:@"http://192.168.6.227:8080/UploadFileServer/up"];
NSMutableURLRequest *mRequest = [NSMutableURLRequest requestWithURL:url];
//設置請求方法
[mRequest setHTTPMethod:@"POST"];
//設置請求體body
[mRequest setHTTPBody:imgData];
//發起請求
[NSURLConnection sendAsynchronousRequest:mRequest queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse * _Nullable response, NSData * _Nullable data, NSError * _Nullable connectionError) {
if (connectionError == nil)
{
NSString *str = [[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding];
NSLog(@"ok:%@",str);
}
}];
三、從系統相冊獲取圖片并上傳至服務器
(一)從系統相冊獲取圖片
項目:uploadFromPhotoAlbum0509
1.使用UIImagePickerController
當前類要實現如下代理即方法:
<UINavigationControllerDelegate, UIImagePickerControllerDelegate>
方法1:
- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary<NSString *,id> *)info
或方法2(已廢棄):
- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingImage:(UIImage *)image editingInfo:(nullable NSDictionary<NSString *,id> *)editingInfo
使用步驟:
//1.創建
UIImagePickerController *imgPickerCtr = [[UIImagePickerController alloc]init];
//2.設置代理
imgPickerCtr.delegate = self;
//3.判斷資源支持情況
BOOL isAvailable = [UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypePhotoLibrary];
if (isAvailable)
{
imgPickerCtr.sourceType = UIImagePickerControllerSourceTypePhotoLibrary;
}
tips:
1.UIImagePickerController的資源類型
①圖庫:UIImagePickerControllerSourceTypePhotoLibrary,
②相機:UIImagePickerControllerSourceTypeCamera,
③相冊:UIImagePickerControllerSourceTypeSavedPhotosAlbum
2.使用GCD
處理耗時任務(block就是任務)
防止處理大圖片時,造成界面卡頓
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
//壓縮比例
NSData *imgData = UIImageJPEGRepresentation(img, 0.5);
//上傳
dispatch_async(dispatch_get_main_queue(), ^{
//拋回到主線程,刷新UI
});
});
(二)上傳至服務器
項目:uploadFromAlbumToServer0509
四、對系統圖庫的操作
項目:ALAssetsLibraryDemo0509
//ALAssetsLibrary 的結構
//圖庫 ALAssetsLibrary
//相冊 ALAssetsGroup
//照片 ALAssetRepresentation
//1.創建圖庫對象
ALAssetsLibrary *library = [[ALAssetsLibrary alloc]init];
//遍歷庫中的相冊
[library enumerateGroupsWithTypes:ALAssetsGroupAll usingBlock:^(ALAssetsGroup *group, BOOL *stop) {
//枚舉器遍歷到最后,group == nil
if (group)
{
//過濾
[group setAssetsFilter:[ALAssetsFilter allPhotos]];
//判斷照片的數量是否大于0(相冊里可以有O張圖片)
if (group.numberOfAssets > 0)
{
//遍歷相冊中的照片
[group enumerateAssetsUsingBlock:^(ALAsset *result, NSUInteger index, BOOL *stop) {
//ALAssetRepresentation:是系統對assets的封裝,里面包含了圖片的信息
ALAssetRepresentation *representation = result.defaultRepresentation;
//根據CGImage創建UIImage
UIImage *img = [UIImage imageWithCGImage:representation.fullScreenImage];
UIImageView *imgView = [[UIImageView alloc]init];
imgView.image = img;
imgView.frame = CGRectMake(0, i*width, width, width);
i++;
[self.view addSubview:imgView];
}];
}
}
} failureBlock:^(NSError *error) {
NSLog(@"%@",error);
}];
GitHub上的第三方庫:
GMImagePicker
五、NSURLSession
項目:NSSession0509
2013年iOS7中,蘋果提出了新的網絡請求方案NSURLSession
日常的iOS開發中,AFNetWorking算是最常見的網絡請求庫:
- AF1.0 建立在 NSURLConnection的基礎上
- AF2.0 同時使用NSURLConnection和NSURLSession
- AF3.0 全部使用NSURLSession(刪除了所有基于NSURLConnection的代碼)
NSURLSession有3種task(任務):
NSURLSessionDataTask:主要用于數據的請求json數據
NSURLSessionDownloadTask:主要用于下載文件
NSURLSessionUploadTask:主要用于上傳文件
請求步驟:
1.url
2.request
3.獲取NSURLSession(session)
4.使用session創建Task(DataTask/DownloadTask/UploadTask)
5.恢復Task(resume)
源碼:
//1.url
NSURL *url = [NSURL URLWithString:@"http://www.baidu.com"];
//2.request
NSURLRequest *request = [NSURLRequest requestWithURL:url];
//***************************重點***************************
//3.使用URLSession替換URLConnection
NSURLSession *session = [NSURLSession sharedSession];
//4.使用task發起請求
NSURLSessionDataTask *dataTask = [session dataTaskWithRequest:request completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
if (error == nil)
{
NSString *strData = [[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding];
NSLog(@“成功。數據信息:%@“,strData);
}
else
{
NSLog(@"失敗。錯誤信息:%@",error);
}
}];
//5.恢復task,task才會執行
[dataTask resume];
六、ALNetWorking
項目:AFNetWorking0509
1.網絡的實時檢測
步驟:
①獲取網絡檢測管理器manager
②使用manager設置任務
③使用manager開始檢測
2.使用 AFHTTPSessionManager 向服務器請求數據
步驟:
①獲取session管理器manager
②使用manager獲取數據
源碼:
//一、網絡的實時檢測
//1.獲取網絡檢測管理器
AFNetworkReachabilityManager *netReachManager = [AFNetworkReachabilityManager sharedManager];
//2.設置任務
[netReachManager setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) {
switch (status) {
case AFNetworkReachabilityStatusUnknown:
NSLog(@"未知網絡");
break;
case AFNetworkReachabilityStatusNotReachable:
NSLog(@"斷網");
break;
case AFNetworkReachabilityStatusReachableViaWWAN:
NSLog(@"蜂窩數據");
break;
case AFNetworkReachabilityStatusReachableViaWiFi:
NSLog(@"WiFi網絡");
break;
default:
break;
}
}];
//3.開始檢測
[netReachManager startMonitoring];
//二、使用 AFHTTPSessionManager 向服務器請求數據
//1.獲取session管理器
AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
//2.使用管理器獲取數據
[manager GET:@"http://api.app.net/stream/0/posts/stream/global" parameters:nil success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) {
NSLog(@"%@",responseObject);
} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
NSLog(@"error:%@",error);
}];
測試:使用ALNetWorking實現上傳下載
上傳:
1.AFHTTPSessionManager
2.post(url)
下載:
1.AFHTTPSessionManager
2.get(url)