2017-06-11 6 views
0

uploadTaskWithRequest:fromFileでファイルをアップロードしようとしています。楽器を使用することで、ファイルがアップロードされている間にサイズがアプリのメモリの一部であることが分かります。これは、大きなファイルの場合にメモリの圧迫を引き起こす可能性があります。uploadTaskWithRequest:fromFile memory usage

これが予想される動作であれば、Appleのドキュメントで見つけることができませんでした。誰かがこれがそうしている方法であるか、それを変える方法があるかどうかを知っていますか?

これは、私は信じている、関連するコードです:

要求:

NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:uploadUrl]; 
request.HTTPMethod = @"PUT"; 

[request setValue:@"gzip, deflate" forHTTPHeaderField:@"Accept-Encoding"]; 
[request setHTTPShouldHandleCookies:YES]; 
return request; 

タスク:

NSURLSessionUploadTask *task = [mForegroundSession uploadTaskWithRequest:theRequest fromFile:fileUrl]; 

答えて

0

NSURLSessionはあなたがNSURLSessionTaskDelegateに準拠している場合uploadTaskWithStreamedRequest:を実行し、ファイルを提供することができますストリームが尋ねられたら。

テストされていないが、それはこのような何か行くだろう:要求されたとき...

// NSURLSessionTaskDelegate 
// 
- (void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task needNewBodyStream:(void (^)(NSInputStream *bodyStream))completionHandler { 
    completionHandler(self.inputStream); 
} 

// optionally track progress 
- (void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didSendBodyData:(int64_t)bytesSent totalBytesSent:(int64_t)totalBytesSent totalBytesExpectedToSend:(int64_t)totalBytesExpectedToSend { 
    // track progress here 
} 

- (void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didCompleteWithError:(NSError *)error { 
    // check for error and track completion here 
} 

素敵な改善がクラスに抽象すべてこれにデリゲートストリームになりまし

// keep a stream available for the delegate 
@property(nonatomic,strong) NSInputStream *inputStream; 

// // return the request as formed by the OP 
- (NSURLRequest *)request { 
    // ... 
    return request; 
} 

- (void)uploadFileAtPath:(NSString *)path { 
    // create the stream 
    self.inputStream = [[NSInputStream alloc] initWithFileAtPath:path]; 
    NSURLSession *session = [NSURLSession sessionWithConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration] delegate:self delegateQueue:nil]; 
    // create a task with a "streamedRequest" 
    NSURLSessionUploadTask *task = [session uploadTaskWithStreamedRequest:[self request]]; 
    [task resume]; 
} 

を進行状況と完了のために呼び出されるブロックプロパティを使用して、デリゲートメソッドによって呼び出されます。

+0

コメントありがとうございますが、StreamedRequestはバックグラウンドセッションでは機能しません。さらに、私はそれを試して、メモリのパフォーマンスは何らかの理由で同じままだった。 – Adam