iOS開發(fā)ASIHTTPRequest直接讀取磁盤數(shù)據(jù)流請(qǐng)求體
本文為大家介紹了iOS開發(fā)ASIHTTPRequest直接讀取磁盤數(shù)據(jù)流的請(qǐng)求體的內(nèi)容,其中包括ASIFormDataRequests,普通ASIHTTPRequest等等內(nèi)容。
從0.96版本開始,ASIHTTPRequest可以使用磁盤上的數(shù)據(jù)來(lái)作為請(qǐng)求體。這意味著不需要將文件完全讀入內(nèi)存中,這就避免的當(dāng)使用大文件時(shí)的嚴(yán)重內(nèi)存消耗。使用這個(gè)特性的方法有好幾種:ASIFormDataRequests和普通ASIHTTPRequest等等,下面來(lái)具體介紹。
ASIFormDataRequests
當(dāng)使用setFile:forKey:時(shí),ASIFormDataRequests自動(dòng)使用這個(gè)特性。request將會(huì)創(chuàng)建一個(gè)包含整個(gè)post體的臨時(shí)文件。文件會(huì)一點(diǎn)一點(diǎn)寫入post體。這樣的request是由 CFReadStreamCreateForStreamedHTTPRequest創(chuàng)建的,它使用文件讀取流來(lái)作為資源。
- NSURL *url = [NSURL URLWithString:@"http://www.dreamingwish.com/"];
- ASIFormDataRequest *request = [ASIFormDataRequest requestWithURL:url];
- [request setPostValue:@"foo" forKey:@"post_var"];
- [request setFile:@"/Users/ben/Desktop/bigfile.txt" forKey:@"file"];
- [request startSynchronous];
普通ASIHTTPRequest
如果你明白自己的request體會(huì)很大,那么為這個(gè)request設(shè)置流式讀取模式。
- [request setShouldStreamPostDataFromDisk:YES];
下面的例子中,我們將一個(gè)NSData對(duì)象添加到post體。這有兩個(gè)方法:從內(nèi)存中添加(appendPostData:),或者從文件中添加(appendPostDataFromFile:);
- NSURL *url = [NSURL URLWithString:@"http://www.dreamingwish.com/"];
- ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];
- [request setShouldStreamPostDataFromDisk:YES];
- [request appendPostData:myBigNSData];
- [request appendPostDataFromFile:@"/Users/ben/Desktop/bigfile.txt"];
- [request startSynchronous];
這個(gè)例子中,我們想直接PUT一個(gè)大文件。我們得自己設(shè)置setPostBodyFilePath ,ASIHTTPRequest將使用這個(gè)文件來(lái)作為post體。
- NSURL *url = [NSURL URLWithString:@"http://www.dreamingwish.com"];
- ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];
- [request setRequestMethod:@"PUT"];
- [request setPostBodyFilePath:@"/Users/ben/Desktop/another-big-one.txt"];
- [request setShouldStreamPostDataFromDisk:YES];
- [request startSynchronous];
IMPORTANT:切勿對(duì)使用上述函數(shù)的request使用setPostBody——他們是互斥的。只有在你要自己建立request的請(qǐng)求體,并且還準(zhǔn)備在內(nèi)存中保持這個(gè)請(qǐng)求體時(shí),才應(yīng)該使用setPostBody。