SDWebImage圖片異步下載php
1.把SDWebImage包導入到工程中html
2.把裏面的.m文件在build phase中添加-fno-objc-arc來轉換編譯模式(在arc中運行)node
3.加頭文件「UIImageView + WebCache.h」添加UIImageView的擴展類ios
4.UIImageView類型調用[setImagewithUrl:]來加載網絡圖片web
//使用擴展方法異步下載圖片並作本地緩存正則表達式
//placeholderImage:默認圖片顯示(當圖片沒有下載完成時,顯示默認圖片)sql
[myImageView setImageWithURL:[NSURL URLWithString:@"http://a.hiphotos.baidu.com/image/w%3D400/sign=7bddb6f4b54543a9f51bfbcc2e168a7b/0bd162d9f2d3572cd91bf4dc8813632762d0c331.jpg"] placeholderImage:[UIImage imageNamed:@"moren.png"]];數據庫
網絡下載和json解析json
1.網絡下載基本使用NSURLConnection數組
C/S結構:client客戶端(手機端)和用戶進行交互
server服務端(web),爲客戶提供數據和數據處理的終端
//網絡接口的HTTP形式接口(http://192.168.88.8/sns/my/user_list.php?page=1&number=20)get接口
(1)NSSting同步下載
-(void)testStringDownload
{
NSString *urlString = @"http://10.0.8.8/sns/my/user_list.php?page=1&number=20";
NSError *error = nil;
NSURL *url = [NSURL URLWithString:urlString];
NSString *userListData = [[NSString alloc] initWithContentsOfURL:url encoding:NSUTF8StringEncoding error:&error];
//若是error有值, 下載失敗
if(error != nil)
{
NSLog(@"下載失敗 Error = %@",error);
return;
}
NSLog(@"userlist = %@",userListData);
}
(2)NSURLConnection同步下載
-(void)urlConnectionSynchronizeDownload
{
NSString *urlString = @"http://10.0.8.8/sns/my/user_list.php?page=1&number=20";
NSURL *url = [NSURL URLWithString:urlString];
NSURLRequest *request = [NSURLRequest requestWithURL:url];
NSError *error = nil;
NSData *data = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:&error];
if(error != nil)
{
NSLog(@"數據下載失敗 error = %@",error);
return;
}
NSString *str = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
NSLog(@"str = %@",str);
}
(3)NSURLConnection異步下載
-(void)urlConnectionAsynchronousDownloadData
{
NSString *urlString = @"http://10.0.8.8/sns/my/user_list.php?page=1&number=20";
NSURL *url = [NSURL URLWithString:urlString];
NSURLRequest *request = [NSURLRequest requestWithURL:url];
// 效果: 方法執行以後當即返回, 一旦有數據下載,通知delegate指向的對象
//startImmediately:YES 是否當即執行
_downloadData = [[NSMutableData alloc] init];
_urlConnection = [[NSURLConnection alloc] initWithRequest:request delegate:self startImmediately:YES];
}
-(void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response
{
NSLog(@"當接受到服務器的響應時執行,開始下載數據");
}
-(void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
{
NSLog(@"當接受到數據時執行, 下載數據較多時執行屢次須要把每次下載的數據合併到一塊兒");
[_downloadData appendData:data];
}
-(void)connectionDidFinishLoading:(NSURLConnection *)connection
{
NSLog(@"數據下載完成");
//獲取下載的數據
//NSString *str = [[NSString alloc] initWithData:_downloadData encoding:NSUTF8StringEncoding];
NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:_downloadData options:NSJSONReadingMutableContainers error:nil];
}
-(void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error
{
NSLog(@"下載失敗 error = %@",error);
}
AFNetWork使用(GET&POST)
1.經過域名去判斷網絡狀態
//iphone網絡狀態(WAN, Wi-Fi, 不可達)
//基本原理: 經過一個域名去判斷
(1)建立一個網絡請求管理者
AFHTTPRequestOperationManager *manager = [[AFHTTPRequestOperationManager alloc] initWithBaseURL:[NSURL URLWithString:@"www.baidu.com"]];
(2).在網絡請求的block參數status中返回網絡狀態
[manager.reachabilityManager setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) {
1.斷網狀態下返回:AFNetworkReachabilityStatusNotReachable = 0,
2.移動網絡狀態(3G,4G)AFNetworkReachabilityStatusReachableViaWWAN = 1,
3.無線網絡狀態AFNetworkReachabilityStatusReachableViaWiFi = 2
}
(3)能夠監聽網絡的狀態變化
//當網絡發生變化也會跑到這個block裏面
//開啓網絡狀態監視
[manager.reachabilityManager startMonitoring];
2.get請求建立
// http://www.baidu.com/index.php?from=qf
// 特色: 上傳的數據放在url的參數中
// url網址每一個瀏覽器有限制的, 約8192字符
// get最好很差上傳密碼
(1)編寫一個urlString做爲網址(完整的url地址,包括有參數?後面的元素)
NSString *urlString = @"http://www.baidu.com/";
(2)建立一個網絡請求管理者
AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
//遇到了問題 Code=-1016, 下載的數據不是json
// 如下的解析器類型獲取的數據是NSData類型的
(3)配置網絡請求的數據類型(通常就使用serializer,肯定responseObject是NSData數據類型)
manager.responseSerializer = [AFHTTPResponseSerializer serializer];
(4)GET請求parameters爲nil,沒有請求Body(最爲重要的方法)
[manager GET:urlString parameters:nil success:^(AFHTTPRequestOperation *operation, id responseObject) {
NSString *str = [[NSString alloc] initWithData:responseObject encoding:NSUTF8StringEncoding];
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
NSLog(@"error = %@",error);
}];
3.get請求建立JSon數據請求
NSString *urlString = @"http://10.0.8.8/sns/my/user_list.php?page=1&number=20";
AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
//解析json的時候遇到問題 -1016, 返回NSData
manager.responseSerializer = [AFHTTPResponseSerializer serializer];
// content-type: text/html
//manager.responseSerializer.acceptableContentTypes = [NSSet setWithObjects:@"text/html", nil];
[manager GET:urlString parameters:nil success:^(AFHTTPRequestOperation *operation, id responseObject) {
NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:responseObject options:NSJSONReadingMutableContainers error:nil];
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
NSLog(@"error = %@",error);
}];
4.post請求
// http://quiet.local/1413/webtest/login/login.php
// "user" = "12321"
// 特色: 數據會放在請求的附加數據中上傳, 數據長度沒有限制
// 經常使用於上傳密碼, 圖片, 文件......
-(void)postRequestTest
{
NSString *url = @"http://10.0.8.8/sns/my/register.php」;
AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
manager.responseSerializer = [AFHTTPResponseSerializer serializer];
//設置請求頭
[manager.requestSerializer setValue:@"ios" forHTTPHeaderField:@"pingtai"];
[manager.requestSerializer setValue:@"8.4" forHTTPHeaderField:@"version"];
[manager.requestSerializer setValue:@"sfwffweifj121131dqd" forHTTPHeaderField:@"cookie"];
[manager POST:url parameters:@{@"user":@"text12323",@"password":@"dfefefw",@"email":@"dfwewfe@2323.com"} success:^(AFHTTPRequestOperation *operation, id responseObject) {
NSString *str = [[NSString alloc] initWithData:responseObject encoding:NSUTF8StringEncoding];
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
NSLog(@"error = %@",error);
}];
}
5.ImageUrl下載(效果沒有SDWebImage好)
-(void)asyncLoadImageTest
{
UIImageView *imageView = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, 320, 480)];
imageView.backgroundColor = [UIColor redColor];
[self.view addSubview:imageView];
//異步加載圖片
// setImageWithURL:是由AFNetworking提供的
[imageView setImageWithURL:[NSURL URLWithString:@"http://img0.bdstatic.com/img/image/shouye/zqsjbtlsjb.jpg"]];
}
1.把一個id(字典或者是數組)製做成一個Object(類對象)
2.當數組或者字典的key發生變化時候,會報錯(能夠發現數據接口的變化)
3.把某個key中的value設置爲相同名稱屬性的值
@{@「name」:@「huang」}
[self setValue:@「」 ForKey:@「name」];
@property (nonatomic,strong) NSString *name;
把name中的value:huang設置爲self.name = huang中的值
4.key值須要有對應的屬性,不然報錯(名字相同)
5.簡單kvc字典編譯
(1)經過此方法,遍歷dic中全部key
(2)dic中的全部key都須要有對應的屬性
[self setValuesForKeysWithDictionary:dic];
XML數據解析
1.配置XML庫(配置完才能使用)
(1)添加頭文件搜索路徑
Build Settings->搜索Header Search Paths-> /usr/include/libxml2
(2)添加二進制庫
Build Phases-> Link library -> libxml2.dylib
(3)源文件添加編譯選項
-fno-objc-arc
(4)添加頭文件
#import "GDataXMLNode.h"
2.GData語法
GDataXMLDocument * doc = [[GDataXMLDocument alloc]initWithData:data options:0 error:nil];
1.單斜杆/ 從根節點一層一層往下搜索節點
NSArray * array = [doc nodesForXPath:@"root/systemConfig/CityName" error:nil];
GDataXMLElement * element = [array firstObject];
//element的名稱和對應的值
NSLog(@"stringValue = %@,name = %@",element.stringValue,element.name);
2.雙斜槓// 直接把document中的全部該節點名稱的節點都獲取出來
NSArray * array2 = [doc nodesForXPath:@"//Item" error:nil];
NSLog(@"count = %lu",(unsigned long)array2.count);
GDataXMLElement * element2 = [array2 firstObject];
for(GDataXMLNode * node in element2.attributes){
NSLog(@"name = %@,stringValue = %@",node.name,node.stringValue);
}
3:@語法:尋找相應的屬性
//通常用法,@會和雙斜槓一塊兒使用(無論屬性在哪一個節點中,直接把屬性獲取出來)
NSArray * array3 = [doc nodesForXPath:@"//@value" error:nil];
for(GDataXMLNode * node in array3){
NSLog(@"name = %@,stringValue = %@",node.name,node.stringValue);
}
GData中的一些屬性介紹
1.獲取根目錄節點
GDataXMLElement * root = doc.rootElement;
2.獲取子節點數量
NSLog(@"root.childCount = %lu",(unsigned long)root.childCount);
3.獲取某個節點的全部子節點
NSArray * array4 = root.children;
4.經過節點的名稱直接從父節點中獲取某個節點
NSArray * array5 = [root.children[0] elementsForName:@"areaCode"];
GDataXMLElement * areaElement = [array5 firstObject];
5.獲取結點的屬性
for(GDataXMLElement *attr in item.attributes)
{
NSLog(@"attr name: %@, value: %@",attr.name,attr.stringValue);
}
下拉刷新JHRefresh庫
入參數1:AniViewClass(下拉下來的顯示類型)
普通文字刷新 [JHRefreshCommonAniView class]
大衆點評刷新 [JHRefreshAmazingAniView class]
__weak SecondTableViewController *ssself = self;
[self.tableView addRefreshHeaderViewWithAniViewClass:[JHRefreshCommonAniView class] beginRefresh:^{
//發請求的方法區域
NSLog(@"觸發下拉刷新headerView");
//製做一個延時操做 延時後收回下拉的headerView
[self.tableView headerEndRefreshingWithResult:JHRefreshResultFailure]; //展現刷新失敗界面,延時隱藏
JHRefreshResultSuccess 展現刷新成功界面,延時隱藏
}];
上拉獲取更多
[self.tableView addRefreshFooterViewWithAniViewClass:[JHRefreshCommonAniView class] beginRefresh:^{
//發請求的方法區域
//製做一個延時操做
double delayTime = 2.0;
dispatch_time_t dispatchTime = dispatch_time(DISPATCH_TIME_NOW, delayTime *NSEC_PER_SEC);
//兩秒之後回到主線程調用方法
dispatch_after(dispatchTime, dispatch_get_main_queue(), ^{
[ssself.tableView footerEndRefreshing]; //收回上拉的footView
NSLog(@"延時操做方法區域");
});
}];
三種延時方法
1.NSTimer *timer = [NSTimer scheduledTimerWithTimeInterval:2 target:ssself selector:@selector(hideHeaderView) userInfo:nil repeats:NO];
2. 入參數:1.方法名 2.傳參 3.延時時間
[ssself performSelector:@selector(hideFootView) withObject:nil afterDelay:2];
3.double delayTime = 2.0;
dispatch_time_t dispatchTime = dispatch_time(DISPATCH_TIME_NOW, delayTime *NSEC_PER_SEC);
//兩秒之後回到主線程調用方法
dispatch_after(dispatchTime, dispatch_get_main_queue(), ^{
NSLog(@"延時操做方法區域");
});
FMDB庫的配置
<1> 把FMDB庫文件拖撿來
<2> 添加二進制庫 sqlite3.dylib
<3> 包含頭文件 #import "FMDatabase.h"
SQLite數據庫
建立數據庫NSHomeDirectory()沙盒目錄
NSString * filePath = [NSString stringWithFormat:@"%@/Documents/data.sqlite",NSHomeDirectory()];
self.dataBase = [[FMDatabase alloc]initWithPath:filePath];
1.打開數據庫
[self.dataBase open];
2.建立表單
NSString * sql = [NSString stringWithFormat:@"CREATE TABLE IF NOT EXISTS %@(name varchar(32),age varchar(32))",tableName];
BOOL isCreate = [self.dataBase executeUpdate:sql];
3.插入數據
NSString * sql = [NSString stringWithFormat:@"INSERT INTO %@(name,age) VALUES('pascal','21')",tableName];
BOOL isInsert = [self.dataBase executeUpdate:sql];
4.刪除數據
NSString * name = @"pascal";
NSString * sql = [NSString stringWithFormat:@"DELETE FROM %@ WHERE name = ?",tableName];
BOOL isDelete = [self.dataBase executeUpdate:sql,name];
5.查找數據
NSString * name = @"pascal";
NSString * sql = [NSString stringWithFormat:@"SELECT * FROM %@ WHERE name = ?",tableName];
FMResultSet * result = [self.dataBase executeQuery:sql,name];
while([result next]){
for(int i = 0; i < fieldArray.count; i++){
NSString * str = [result stringForColumnIndex:i];
NSLog(@"%@ = %@",fieldArray[i],str);
}
或者
for(NSString * key in fieldArray){
NSString * value = [result stringForColumn:key];
NSLog(@"key = value",key = value);
}
}
6.修改數據
NSString * sql = [NSString stringWithFormat:@"UPDATE %@ SET name = 'iceice' WHERE name = 'pascal'",tableName];
BOOL isUpdate = [self.dataBase executeUpdate:sql];
7.關閉數據庫
[self.dataBase close];
SQL基本語法(重點)
1.修改操做關鍵字
(1)增:(關鍵字)insert
(2)刪:delete
(3)改:update
(4)查:select
2.常使用關鍵字
(1)在哪裏執行操做:from+數據表
(2)加在哪一個位置into +數據表(與insert一塊兒使用)
(3)條件語句:where
3.修飾關鍵字
(1)top +條數(前面十條數據)
(2)order by + 字段名 (按照這個名來排序)
(3)[desc]升降序標示
(4)like (與這個字段類似)
(5)in+多個值(選取這幾個值)
(6)between +兩個值(兩個值之間的全部值)
CoreData 簡介
一、iOS開發中實現數據持久化存儲的⼀種重要手段。
二、CoreData提供了對象-關係映射的功能,能將 Objective-c的對象使⽤用數據庫或者XML等⽅方式 存儲。
三、若是使⽤用CoreData將數據存到數據庫中,不 ⽤用經過sql語句來操做數據
CoreData核心類
一、NSManagedObjectModel,⽤用來加載
coreData數據模型⽂文件,全部的數據模型能夠 所有加載到此對象中。
二、NSManagedObjectContext,⽤用於操做數據 模型(對象),並監測數據模型(對象)的變化。
三、NSPersistentStoreCoordinator, 數據 持久化存儲協調器,負責調度上層與底層對數據的
操做。四、NSManagedObject, 具體的數據模型對象
五、NSEntityDescription,模型描述類,可以
實例化獲得具體的數據模型對象 六、NSFetchRequest,數據查詢請求類
七、NSPredicate,經過謂詞設置查詢條件的類 (正則表達式)
CoreData的使用
1.建立CoreData文件
2.添加CoreData模型
3.加載CoreData文件
#數據庫準備
1.取出CoreData文件路徑
NSString * filePath = [[NSBundle mainBundle]pathForResource:@"Model" ofType:@"momd"];
2.取出CoreData在工程中的模型
NSManagedObjectModel * model = [[NSManagedObjectModel alloc]initWithContentsOfURL:[NSURL fileURLWithPath:filePath]];
3.製做一個關聯層(用於coreData和數據庫sqlite的關聯)
self.coor = [[NSPersistentStoreCoordinator alloc]initWithManagedObjectModel:model];
4.製做一個數據庫地址
NSString * dBfilePath = [NSString stringWithFormat:@"%@/Documents/data.sqlite",NSHomeDirectory()];
5.關聯層建立數據庫返回對象
//入參:(1)Type:設置關聯類型爲數據庫sqlite
(2)URL:設置須要關聯的數據庫地址
NSPersistentStore * store = [self.coor addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:[NSURL fileURLWithPath:dBfilePath] options:0 error:nil];
6.製做一個操做對象
self.context = [[NSManagedObjectContext alloc]init];
7.獲取數據庫和coreData的關聯層
self.context.persistentStoreCoordinator = self.coor;
#數據庫操做
1.添加數據
-(void)insertData{
//從表單中建立一個將要插入到表單中的Person對象
Person * p = [NSEntityDescription insertNewObjectForEntityForName:@"Person" inManagedObjectContext:self.context];
p.name = @"iceice";
p.age = @"21";
p.gender = @"0";
NSError * error;
if([self.context save:&error]){
NSLog(@"插入成功");
}else{
NSLog(@"插入失敗 error= %@",error.localizedDescription);
}
}
2.刪除數據
-(void)deleteData{
//建立一個查詢返回結果對象
NSFetchRequest * request = [[NSFetchRequest alloc]initWithEntityName:@"Person"];
//把查詢結果轉化成數組數據
NSArray * dataArray = [self.context executeFetchRequest:request error:nil];
NSLog(@"dataArray = %@",dataArray);
for(Person * p in dataArray){
NSLog(@"name = %@",p.name);
[self.context deleteObject:p]; //刪除對象(刪除數據庫某條數據)
//[self.context deleteObjects]; //刪除全部數據(清空表單)
[self.context save:nil]; //操做完數據庫 須要保存
}
}
3.查詢數據
-(void)seleteData{
NSFetchRequest * request = [[NSFetchRequest alloc]initWithEntityName:@"Person"];
//設置查詢條件
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"name like %@",@"bing"];
//把predicate加載到request
[request setPredicate:predicate];
NSArray * dataArray = [self.context executeFetchRequest:request error:nil];
for(Person * p in dataArray){
NSLog(@"name = %@",p.name);
NSLog(@"age = %@",p.age);
}
}
4.修改數據
-(void)updateData{
NSFetchRequest * request = [[NSFetchRequest alloc]initWithEntityName:@"Person"];
NSArray * dataArray = [self.context executeFetchRequest:request error:nil];
for(Person * p in dataArray){
p.name = @"bing";
}
[self.context save:nil];
}
工程的生命週期
1.工程開始時的UI入口
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions;
2.工程進入後臺的狀態時調用(按home鍵後)
- (void)applicationDidEnterBackground:(UIApplication *)application
3.返回到前臺調用的方法
- (void)applicationWillEnterForeground:(UIApplication *)application
4.工程銷燬時調用的方法
- (void)applicationWillTerminate:(UIApplication *)application
第三方庫MagicalRecord使用
1.在工程開始時的UI入口建立數據庫
[MagicalRecord setupCoreDataStackWithStoreNamed:@"data.sqlite"];
2.在工程銷燬時清理數據庫
數據庫的clearUp清理
[MagicalRecord cleanUp];
3.添加數據
-(void)insertData{
Person * p = [Person MR_createEntity];
p.name = @"Rapunzel";
p.age = @"22";
p.gender = @"0";
[[NSManagedObjectContext MR_defaultContext]MR_saveToPersistentStoreAndWait];
}
4.刪除數據
-(void)deleteData{
NSArray * arr = [Person MR_findByAttribute:@"name" withValue:@"Rapunzel"];
for(Person * p in arr){
[p MR_deleteEntity];
}
}
5.修改數據
-(void)updateData{
NSArray * arr = [Person MR_findAll];
for(Person * p in arr){
p.name = @"Pascal";
NSLog(@"name = %@",p.name);
}
[[NSManagedObjectContext MR_defaultContext]MR_saveToPersistentStoreAndWait];
}