【问题标题】:Where to store large files fetched initially in a IOS App在哪里存储最初在 IOS 应用程序中获取的大文件
【发布时间】:2015-02-21 10:20:30
【问题描述】:

我的应用程序在启动时下载了一个大约 300MB 的 sqlite 数据库。下载完成后,这个 sqlite 数据库应该在应用程序的安装期间可用(年:-))。我不知道在哪里存储这些文件。

我开始将数据存储在库路径中,如下所示(swift)

var sDataPath = NSSearchPathForDirectoriesInDomains(.LibraryDirectory, .UserDomainMask, true);

不,我意识到在使用 IOS 模拟器进行开发和测试期间这条路径会发生变化。例子: 1. 我第一次在 OIS Simulator 中启动应用程序。评估路径是

[/Users/user/Library/Developer/CoreSimulator/Devices/19E2CB7E-3ABB-4C0A-8B49-39A0BE392A93/data/Containers/Data/Application/5EE51B55-0A89-45FB-A1E2-9BE3DCD33463/Library]

2。应用程序下载数据。这需要几分钟。 3.我关闭模拟器并重新启动xcode 4. 我在模拟器中再次启动应用程序,并希望在我的应用程序的库路径中拥有已经下载的数据。但不是 ... 5. 应用评估一个新路径,该路径在路径中有另一个 ID:

[/Users/user/Library/Developer/CoreSimulator/Devices/19E2CB7E-3ABB-4C0A-8B49-39A0BE392A93/data/Containers/Data/Application/429206E9-00EA-45EF-BE6E-4B2E9374BAF5/Library]

6。应用会再次下载内容。

我希望在设备的整个生命周期内都有一条静态路径。我做错了什么或者我应该改变什么?

【问题讨论】:

    标签: ios swift ios-simulator


    【解决方案1】:

    路径在模拟器上会发生变化,但在真实设备上会是一样的。

    如果我没记错的话,在模拟器上,每次重启时路径都会改变。在设备上,仅当您删除并重新安装应用程序时,路径才会更改。

    【讨论】:

    • 感谢您的精彩解释。因此,如果我每次开始都必须下载一个大文件,我就会遇到问题。有没有一种聪明的方法可以在模拟器和真实设备上处理/测试同一个应用程序。我的意思是我应该在代码中检测模拟器是否正在运行并设置静态路径。这种情况的常见方法是什么?
    • 我不明白,因为您的沙箱的路径应该是无关紧要的。相对于您的应用自己的根目录的路径将始终等于
    • 我不明白。我的问题是。我如何获得一个路径(不自己做一个静态字符串),它总是一样的,即使我重新启动我的 mac。所以最后模拟器会在第一次会话下载后再次找到我的文件。否则测试将意味着每次启动它都会下载 3 分钟。
    【解决方案2】:

    您应该将下载的图像保存到文档目录。通过这种方式,图像可以快速加载。如果您想克服重新加载单元格的问题,那么您必须检查文件路径是否存在填充。

    - (NSString *)documentsPathForFileName:(NSString *)name folder:(NSString*)folderName{
        return [[self pathToPatientPhotoFolder:folderName] stringByAppendingPathComponent:name];
    }
    
    - (NSString *)pathToPatientPhotoFolder:(NSString *)folderName {
        NSString *documentsDirectory = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,
                                                                        NSUserDomainMask,
                                                                        YES) lastObject];
        NSString *patientPhotoFolder = [documentsDirectory stringByAppendingPathComponent:folderName];
    
        // Create the folder if necessary
        BOOL isDir = NO;
        NSFileManager *fileManager = [[NSFileManager alloc] init];
        if (![fileManager fileExistsAtPath:patientPhotoFolder
                           isDirectory:&isDir] && isDir == NO) {
            [fileManager createDirectoryAtPath:patientPhotoFolder
               withIntermediateDirectories:NO
                                attributes:nil
                                     error:nil];
        }
        return patientPhotoFolder;
    }
    

    在你的 cellForRowAtIndexPath: 方法中

    {…..
    
    NSURL *urla = [NSURL URLWithString:[NSString stringWithFormat:@"%@",[self.imagearray objectAtIndex:indexPath.item]]];
        NSString *thumbnailCacheKey = [NSString stringWithFormat:@"thumb-%@",[self.imageIDarray objectAtIndex:indexPath.item]];;
        UIImage *image = [UIImage imageWithContentsOfFile:[self documentsPathForFileName:thumbnailCacheKey folder:@"thumb"]];
    
    if (!image){
        //first download image here and then save that image like:
        NSString *stringPath = [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)objectAtIndex:0]stringByAppendingPathComponent:@"thumb"];
        // New Folder is your folder name
        NSError *error = nil;
                if (![[NSFileManager defaultManager] fileExistsAtPath:stringPath])
                    [[NSFileManager defaultManager] createDirectoryAtPath:stringPath withIntermediateDirectories:NO attributes:nil error:&error];
    
                NSString *filePath = [stringPath stringByAppendingPathComponent:thumbnailCacheKey];
                NSData *pngData = UIImageJPEGRepresentation(image, 0.8);
                    [pngData writeToFile:filePath atomically:YES];
    }
    else{// image is already downloaded, so just set that image
        cell.imageView.image = image;
    }
    ….
    }
    

    此代码在您的 DocumentDirectory 中创建文件夹并将图像保存在那里并从那里获取。我使用一个唯一的 photoID 保存,因此图像不能相同。您可以根据需要保存。

    【讨论】:

    • 问题依旧。重新启动后路径会更改。至少在重新启动mac之后。这样,当评估的路径每次都发生变化时,我无法测试我的应用程序。
    • 你试过了吗?在我的代码中,我没有使用固定路径保存。只需添加两个方法并应用相同的代码。
    【解决方案3】:

    您应该将其存储在缓存文件夹中。

    NSString *cachesPath = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) lastObject];
    NSString *cacheFile = [cachesPath stringByAppendingPathComponent:@"file.plist"];
    

    在其他目录中存储大文件将被苹果应用审查团队拒绝(正如我所面临的)

    【讨论】:

    • 我的 sqlite 数据库应该在整个 App 安装期间存储。所以我认为缓存目录不是一个好地方。即便如此,每次模拟器启动时路径都会发生变化。
    猜你喜欢
    • 2012-09-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-09
    • 2021-11-01
    • 2013-07-14
    • 1970-01-01
    相关资源
    最近更新 更多