iOS 基礎知識大全之網絡篇(可供零基礎學習)

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"]]; 

}


KVC鍵值監聽

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];

}

相關文章
相關標籤/搜索