IOS中的網絡編程

ayue 8年前發布 | 13K 次閱讀 網絡編程 iOS開發 Objective-C開發

來自: http://www.cnblogs.com/jerehedu/p/5162168.html

在移動互聯網時代,幾乎所有應用都需要用到網絡下載,比如圖片的加載,音樂的下載,安裝包的下載,等等,下面我們來看看如何進行下載

一、文件的下載我們用get來請求數據,并對請求的二進制數據進行解析存入文件,首先我們先引入一個第三方進度條 ,并且進行初始化

- (void)viewDidLoad {
    [super viewDidLoad];

    //設置背景色
    self.view.backgroundColor=[UIColor greenColor];

    //引入第三方進度條
    self.da=[[DACircularProgressView alloc] initWithFrame:CGRectMake(375/2.0-50, 30, 100, 100)];
    [self.view addSubview:self.da];

}

二、設置文件下載地址,開始下載數據

#pragma mark - 開始下載數據
- (void) start{
        //設置網絡資源地址
        NSString * str=@"http://dl.g.youku.com/20151023/1445588041_20151023XXXX.apk";
        NSURL * url=[NSURL URLWithString:str];
        NSMutableURLRequest * request=[NSMutableURLRequest requestWithURL:url];

       // 設置Range,代表請求的開始位置,剛開始的默認位置為0
        [request setValue:[NSString stringWithFormat:@"bytes=%ld-",self.currentLength] forHTTPHeaderField:@"Range"];
      //發送請求
      self.conn= [NSURLConnection connectionWithRequest:request delegate:self];

}

三、實現代理方法

在下載的時候我們通常采用可變的NSMutableData來存下載的數據,但是用這種方式會導致內存越來越大,本來手機的內存都是有限的,因此我們需要對其進行優化,防止閃退,解決方式是我們不采用將請求的數據緩存帶內存中,而是采取及時下載及時緩存的方式,每次下載都寫入文件,代碼如下

@interface ViewController ()<NSURLConnectionDataDelegate>


/** 當前下載長度*/
@property(nonatomic,assign) NSInteger currentLength;

/** 文件總長度*/
@property(nonatomic,assign) NSInteger totalLength;

/** 鏈接長度*/
@property(nonatomic,strong) NSURLConnection * conn;

/** 文件寫入句柄*/
@property(nonatomic,strong) NSFileHandle * handle;

/** 第三方進度條*/
@property(nonatomic,strong) DACircularProgressView * da;
/** 第三方進度條*/
@property(nonatomic,weak) DPMeterView * dp;
@end

#pragma mark - 響應代理方法,在沙盒創建文件和文件句柄
- (void) connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response{

    if (self.totalLength<=0) {
         self.totalLength=response.expectedContentLength;
    }

    //創建文件操作句柄
    if (self.handle==nil) {

        //獲取文件路徑
        NSString *path=[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) firstObject];
        path=[path stringByAppendingPathComponent:@"jereh.apk"];

        //創建管理類
        NSFileManager * manager=[NSFileManager defaultManager];
        [manager createFileAtPath:path contents:nil attributes:nil];

        //初始化管理句柄
        self.handle=[NSFileHandle fileHandleForWritingAtPath:path];
    }


}

#pragma mark - 接受數據代理方法,將接受到的數據寫入文件,并且計算下載進度
- (void) connection:(NSURLConnection *)connection didReceiveData:(NSData *)data{

    //記錄當前長度,算取百分比
    self.currentLength+=data.length;
    CGFloat percent=self.currentLength*1.0/self.totalLength;

    //移動到文件末尾
    [self.handle seekToEndOfFile];

   //將當前數據寫入文件
    [self.handle writeData:data];

    //修改進度條
    self.da.progress=percent;

}

四、在文件下載時候我們需要暫停功能,如何讓一個下載中的請求暫停呢?我們只需要調用取消方法即可

#pragma mark - 設置暫停方法
- (void) pause{
    [self.conn cancel];
    self.conn=nil;
}

五、最后關閉句柄

#pragma mark - 關閉句柄
-(void)dealloc{

    [self.handle closeFile];
}

作者:杰瑞教育

出處: http://www.cnblogs.com/jerehedu/

版權聲明:本文版權歸 煙 臺 杰瑞教育

技有限公司 和博客園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接,否則保留追究法律責任的權利。

技術咨詢:

 本文由用戶 ayue 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!