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