AFNetworking使用3G上传时“无法分配内存”

时间:2012-06-28 11:31:34

标签: objective-c memory upload afnetworking

我正在使用AFNetworking使用多部分POST将文件上传到Web服务。使用WiFi时一切正常,但通过3g上传时,对于大于2兆字节的文件,上传失败。

我尝试了两种方法,都在发送的确切字节数下失败:1998848。如果文件或文件小于该文件,则上传成功。

Amazon S3 SDK存在同样的问题,他们建议限制上传,但我找不到使用AFNetworkingNSUrlConnection执行此操作的方法。

我还记得iOS在流式传输时每5分钟限制为5兆。我不确定这是否适用,但以我的3g速度,我在一分钟内上传约2兆。也许那可能是它?再一次,找不到任何相关的信息。

有什么想法吗?这是我的代码:

多部分上传:       

NSMutableURLRequest *request = [[DIOSSession sharedSession] multipartFormRequestWithMethod:@"POST" path:[NSString stringWithFormat:@"%@/%@", kDiosEndpoint, @"demotix_services_story/upload"] parameters:params constructingBodyWithBlock: ^(id <AFMultipartFormData> formData) {
    for (NSString * fkey in files) {
        NSDictionary *file = [files objectForKey:fkey];
        NSURL *fileUrl = [NSURL fileURLWithPath:[file valueForKey:@"fileUrl"]];
        NSString *fileName = [file valueForKey:@"name"];

        [formData appendPartWithFileURL:fileUrl name:fileName error:&error];
    }

}];

AFHTTPRequestOperation *operation = [[AFHTTPRequestOperation alloc] initWithRequest:request];
[operation setUploadProgressBlock:^(NSInteger bytesWritten, long long totalBytesWritten, long long totalBytesExpectedToWrite) {
    [delegate updateUploadProgress:totalBytesWritten from:totalBytesExpectedToWrite];
}];
[operation setCompletionBlockWithSuccess:success failure:failure];
[operation start];

将所有文件合并为一个并尝试对其进行流式处理:

NSURLRequest *nrequest = [[DIOSSession sharedSession] requestWithMethod:@"POST" path:[NSString stringWithFormat:@"%@/%@", kDiosEndpoint, @"demotix_services_story/upload"] parameters:params];

AFHTTPRequestOperation *noperation = [[AFHTTPRequestOperation alloc] initWithRequest:nrequest];
noperation.inputStream = [NSInputStream inputStreamWithFileAtPath:storePath];
noperation.outputStream = [NSOutputStream outputStreamToMemory];
[noperation setUploadProgressBlock:^(NSInteger bytesWritten, long long totalBytesWritten, long long totalBytesExpectedToWrite) {
    [delegate updateUploadProgress:totalBytesWritten from:totalBytesExpectedToWrite];
}];
[noperation setCompletionBlockWithSuccess:success failure:failure];
[noperation start];

谢谢,

安都

1 个答案:

答案 0 :(得分:1)

ASIHTTPRequest支持带宽限制。

如果您不愿意切换,您可以分析其代码以查看它是如何关闭的,以及您是否可以扩展AFNetworking来执行相同操作。看看方法:

 scheduleReadStream
 unscheduleReadStream

setShouldThrottleBandwidthForWWAN