当PFFile太大时,应用程序崩溃

时间:2014-07-31 11:41:24

标签: objective-c xcode parse-platform

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

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

我试图用if(错误)语句来捕获错误,但没有运气。

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 0x1973281fc 0x18ae1ee90 0x10011d550 0x1000c6ae4 0x100141334 0x197900014 0x1978fffd4 0x1979031dc 0x18addec2c 0x18addcf6c 0x18ad1dc20 0x190a05c0c 0x18de4efdc 0x1000d5218 0x19791baa0) libc ++ abi.dylib:以NSException类型的未捕获异常终止

2 个答案:

答案 0 :(得分:8)

PFFile对象的大小限制为10MB

  

PFFile

     

PFFile允许您将应用程序文件存储在云中   否则太大或太麻烦,不适合普通的PFObject。   最常见的用例是存储图像,但您也可以使用它   文档,视频,音乐和任何其他二进制数据(最多10个   兆字节)。

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

  

参考答案,https://stackoverflow.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会改变主意并允许上传双倍大小的文件!

答案 1 :(得分:1)

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文档中存在错误&lt;文件部分&lt; PFFile:

enter image description here

Source of this information

它是10 Mebibytes而不是10 MB。