【发布时间】:2017-10-14 17:25:28
【问题描述】:
我正在尝试将大约 50MB 但不超过 100MB 的音频文件从用户设备上传到 PHP 服务器。只要文件很小就没有问题,但是这些较大的文件会导致应用程序由于以下错误而崩溃:“由于内存问题而终止”。是否需要实施诸如 AlamoFire 之类的框架来解决此问题,或者我在文档中遗漏了什么?
谢谢, 这是我的代码:
- (void)initWithWebRequests:(NSMutableURLRequest *)URLRequest inBlock:(ResponseBlock)resBlock
{
NSBlockOperation *operation = [NSBlockOperation blockOperationWithBlock:^{
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), ^{
__block id responseObjects = nil;
NSLog(@"URL Request:%@",URLRequest);
NSURLSession *session = [NSURLSession sharedSession];
NSURLSessionDataTask *task = [session dataTaskWithRequest:URLRequest
completionHandler:
^(NSData *data, NSURLResponse *response, NSError *error) {
NSString *responseString = [[NSString alloc] initWithData:data encoding:NSASCIIStringEncoding];
if (data.length > 0)
{
id allValues = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingAllowFragments error:&error];
if([(NSDictionary *)allValues count] <= 0)
responseString = @"Not Available";
responseObjects = allValues;
}
else if(error != nil)
{
responseString = @"Fail";
}
else if(data.length == 0)
{
responseString = @"Not Available";
}
dispatch_sync(dispatch_get_main_queue(), ^{
[[NSOperationQueue mainQueue] addOperationWithBlock:^{
if (error) {
resBlock(error, responseObjects, responseString);
}
else {
resBlock(error, responseObjects, responseString);
}
}];
});
}];
[task resume];
});
}];
[operation setQueuePriority:NSOperationQueuePriorityNormal];
[self.operationQueue addOperation:operation];
}
【问题讨论】:
-
顺便问一下,基于操作的方法的意图是什么?您是否知道此操作不会等待上传完成?嘿,如果您正在为请求的构建构建操作,那很好,但如果您的意图是有一个操作不仅包含请求的构建,而且还执行它,上面将无法实现您的目标想。此外,如果你真的要上传 100mb 的文件,你可能最终会想要使用后台会话,这与操作队列方法是对立的。
-
哇,这是个好主意。我认为我的代码非常简陋。作为一名新开发人员,我仍在学习不同的方法,但我非常感谢您的反馈。
标签: php ios objective-c