PFFile 太大时应用程序崩溃

Posted

技术标签:

【中文标题】PFFile 太大时应用程序崩溃【英文标题】:App crashes when PFFile is too large 【发布时间】:2014-07-31 11:41:24 【问题描述】:

当我尝试上传大于 10mb 的 PFFile 时,我的应用程序崩溃了。我认为 Parse 会捕获错误,此时我可以显示警报视图,但应用程序只是崩溃了。

我下面的代码可以很好地保存图像,但就像我说的,如果文件太大,它会崩溃。

我尝试使用 if (error) 语句来捕捉错误,但没有成功。

PFQuery *query = [PFQuery queryWithClassName:@"Football_Clubs"];

    [query getObjectInBackgroundWithId:objectId block:^(PFObject *object, NSError *error)
     
         NSData *imageData = UIImagePNGRepresentation(badgeImage);
         PFFile *imageFile = [PFFile fileWithName:@"image.png" data:imageData];
         object[@"badge_image"] = imageFile;

         [imageFile saveInBackgroundWithBlock:^(BOOL succeeded, NSError *error)
         
             if (succeeded)
             
                 [object saveInBackgroundWithBlock:^(BOOL succeeded, NSError *error) 
                     if (succeeded)
                     
                         badgeImageView.image = nil;
                         [getSettingsQuery clearCachedResult];
                         [self loadSettings];
                         [progress setText:@"Saved"];
                     
                 ];
             
          progressBlock:^(int percentDone)
         
             [progress setText:[NSString stringWithFormat:@"Saving image - %d%@ complete", percentDone, @"%"]];
         ];
     ];

我的控制台日志如下:

2014-07-31 12:40:47.466 Sporter[21017:60b] * 由于未捕获的异常“NSInvalidArgumentException”而终止应用程序,原因:“PFFile 不能大于 10485760 字节” * 首先抛出调用栈: (0x18ae1ef50 0x18ae1eee90 0x10011d550 0x10011d550 0x10011d550 0x1001400014 0x197900014 0x197900014 0x197900014 0x197900014 0x197900014 0x1978fffd4 0x1979031dc 0x18addec2c 0x18addcf6c 0x18ad1dc20 0x18de4efdc 0x18de4efdc 0x180d5218 0x19791baa0) libc++abi.dylib:以 NSException 类型的未捕获异常终止

【问题讨论】:

当你说文件大于10mb?你怎么会知道这事?另外,您确定不只是应用程序由于内存压力而崩溃吗?什么是崩溃日志?请注意,应用崩溃与错误不同。 @Fogmeister 抱歉 - 应该提到这一点。当它崩溃时,我会在控制台输出中提到它。 nick - 太棒了,报告,谢谢。我想知道有没有其他人看到过这个错误?我将它发布到解析邮件列表。您可以在崩溃日志或控制台日志中进行编辑吗? @JoeBlow 确定 - 完成。 好吧,确定检查 NSData 字节的大小?在尝试将其放入 PFFile 之前。 【参考方案1】:

PFFile 对象的大小限制为 10MB

PF 文件

PFFile 让您可以将应用程序文件存储在云中 否则太大或太笨重而无法放入常规 PFObject。 最常见的用例是存储图像,但您也可以将其用于 文档、视频、音乐和任何其他二进制数据(最多 10 兆字节)。

取自关于 PFFile 的 ios 指南,https://parse.com/docs/ios_guide#files/iOS

从这里参考答案,https://***.com/a/16729142/1603234

在您的情况下,10485760 字节意味着 10.48576 兆字节。所以这是最大文件大小。

如何获取文件大小?

NSDictionary *attributes = [[NSFileManager defaultManager] attributesOfItemAtPath:yourFilePath error:nil];
unsigned long long fileSize = [attributes fileSize]; // result would be in bytes

if(fileSize <= 10485760) 
    //you can continue for upload.
else
   //file size exceeding, can't upload.

但这是静态的,不可暗示,因为如果 PARSE 会改变主意并允许上传双倍大小的文件!

【讨论】:

请不要重复答案。如果问题是重复的,则使用重复的问题投票关闭它。 @Fogmeister,是的!我为此道歉。但是我正在为这个问题找到一个解决方案。 是的,我知道。如果您阅读了这个问题,您会发现我只是希望能够在尝试上传超过 10mb 的文件时处理错误。【参考方案2】:

Swift 中的示例:

func imageFileSize() 
    let data: NSData = NSData(contentsOfURL: NSURL(string: myURL)!)!
    println("\(data.length) bytes")
    println("\( Double(data.length) * pow(Double(10.0), Double(-6.0)) ) MB") // MB: Megabytes
    println("\( Double(data.length) / pow(Double(2.0), Double(20.0)) ) MiB") // MiB: Mebibytes
    println("isFileSizeUpTo10Mebibytes(\(data.length)) returns: \(isFileSizeUpTo10Mebibytes(data.length))")


/* return true if fileSize <= 10485760 bytes
   else return false */
func isFileSizeUpTo10Mebibytes(fileSize: Int) -> Bool 
    return fileSize <= 10485760

此外,iOS/OSX SDK 文档 中有一个错误

(Source of this information)

它是 10 兆字节,而不是 10 兆字节。

【讨论】:

以上是关于PFFile 太大时应用程序崩溃的主要内容,如果未能解决你的问题,请参考以下文章

Pollard Rho 在输入不太大时崩溃

应用启动时加载用户配置文件,选择视图时崩溃,将 PFFile 转换为 UIImage

从缓存中获取数据时 PFFile 崩溃

当位掩码(标志)枚举变得太大时该怎么办

当图像放大太大时,UIPinchGestureRecognizer 表现得很有趣

Parse iOS SDK 上 PFFile.getData() 的 NSFileProtection 级别是啥?