2017-06-11 46 views
0

我试图通过上传文件uploadTaskWithRequest:fromFile。通过使用仪器,我可以看到,在文件上传时,它的大小是应用程序内存的一部分。这可能会导致一个大文件的情况下的内存压力。uploadTaskWithRequest:fromFile memory usage

我在苹果的文档中找不到这是预期的行为。有没有人知道这是否应该是它的方式或有改变它的方法。

这是相关的代码,我相信:

请求:

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:,并提供一个文件当被问到时流。

未经检验的,但它会去是这样的:

// 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]; 
} 

有代表的流请求时...

// 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 
} 

一个很好的改进是抽象的这一切都成一个类带有调用进度和完成的块属性,由委托方法调用。

+0

感谢您的评论,但StreamedRequest不适用于后台会话。此外,我确实尝试过,内存性能由于某种原因保持不变。 – Adam