IOS中的網絡編程

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

}</pre>

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

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

}</pre>

三、實現代理方法

在下載的時候我們通常采用可變的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;

}</pre>

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

#pragma mark - 設置暫停方法

  • (void) pause{ [self.conn cancel]; self.conn=nil; }</pre>

    五、最后關閉句柄

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

    [self.handle closeFile]; }</pre>

    作者:杰瑞教育

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

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

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

    技術咨詢:

    </div> </div>

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