iOS開發(fā)ASIHTTPRequest直接讀取磁盤數(shù)據(jù)流請求體
本文為大家介紹了iOS開發(fā)ASIHTTPRequest直接讀取磁盤數(shù)據(jù)流的請求體的內(nèi)容,其中包括ASIFormDataRequests,普通ASIHTTPRequest等等內(nèi)容。
從0.96版本開始,ASIHTTPRequest可以使用磁盤上的數(shù)據(jù)來作為請求體。這意味著不需要將文件完全讀入內(nèi)存中,這就避免的當使用大文件時的嚴重內(nèi)存消耗。使用這個特性的方法有好幾種:ASIFormDataRequests和普通ASIHTTPRequest等等,下面來具體介紹。
ASIFormDataRequests
當使用setFile:forKey:時,ASIFormDataRequests自動使用這個特性。request將會創(chuàng)建一個包含整個post體的臨時文件。文件會一點一點寫入post體。這樣的request是由 CFReadStreamCreateForStreamedHTTPRequest創(chuàng)建的,它使用文件讀取流來作為資源。
- 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體會很大,那么為這個request設(shè)置流式讀取模式。
- [request setShouldStreamPostDataFromDisk:YES];
下面的例子中,我們將一個NSData對象添加到post體。這有兩個方法:從內(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];
這個例子中,我們想直接PUT一個大文件。我們得自己設(shè)置setPostBodyFilePath ,ASIHTTPRequest將使用這個文件來作為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:切勿對使用上述函數(shù)的request使用setPostBody——他們是互斥的。只有在你要自己建立request的請求體,并且還準備在內(nèi)存中保持這個請求體時,才應(yīng)該使用setPostBody。