我正在使用一个应用程序,我必须在flickr上传图像。当我一次选择15-20个图像并调用上传方法时,它开始上传并且没有问题,但问题是当选择超过40个图像并立即开始上传时,其内存增加超过300mb并且应用程序崩溃。我不知道这是iOS操作系统或Flickr api的架构问题,它会立即开始上传所有图像。有没有办法我一次发送一个图像,上传后我发送第二个图像,所以一次只上传一个图像,没有内存问题。 我的一些关于flickr的上传方法:
-(void)startupuploader:(NSString *)filePath{
image=YES;
NSLog(@"filepath in flicke : %@",filePath);
JPEGData = [[NSData alloc]initWithContentsOfFile:filePath];
// NSLog(@"JPEGData in flicke : %@",JPEGData);
NSData *data = [NSData dataWithContentsOfURL:[NSURL URLWithString:filePath]];
NSLog(@"data in flicke : %@",data);
[self.flickrRequest uploadImageStream:[NSInputStream inputStreamWithData:JPEGData] suggestedFilename:@"Flickr"
MIMEType:@"image/jpeg" arguments:[NSDictionary dictionaryWithObjectsAndKeys:@"0", @"is_public", nil]];
[UIApplication sharedApplication].idleTimerDisabled = YES;
}
当我调用此方法进行上传时,它会立即执行所有路径并立即开始上传所有图像,从而导致应用程序崩溃。 请帮帮我。 提前谢谢。
答案 0 :(得分:0)
有几点想法:
不是按顺序执行,(为此你会支付严重的性能损失)我可能会建议同时执行此操作,但要控制并发度。例如,我可能建议在NSOperation
中包装上传,并将这些操作添加到操作队列中,其中maxConcurrentOperationCount
为4或5.这样您就可以享受一些并发性(以及将产生的性能增益),但是它限制它,所以你不会耗尽有限的网络连接或一次消耗太多的内存。
我很难比这更具体,因为我不熟悉这种uploadImageStream
方法。这是你自己的方法(在这种情况下你应该更新你的问题向我们展示这个方法)还是Flickr提供的方法?通常,如果方法异步运行,则它们提供完成块或委托方法以指示完成。您需要一些完成模式才能通过NSOperationQueue
享受受控程度的并发性。
不是将文件加载到NSData
然后从中创建流,而是为什么不创建[NSInputStream inputStreamWithFileAtPath:filePath]
,并完全绕过NSData
。这应该严重限制内存使用,这本身就是一切。您当前的模式将尝试同时将所有这些图像完全加载到内存中。通过使用流,它将减少在任何给定时间使用的内存量。