寻找在iOS中构建动态文件路径的逻辑解决方案

时间:2013-12-06 16:32:35

标签: ios iphone objective-c dynamic filepath

我有一个以下列方式构建的文件结构。

1)在MySQL数据库中为每个用户提供一个ID。

2)当用户从iphone上传图像时,图像将放在以下目录中:

`../images/[USER_ID]/[IMAGE_NUMBER].jpg`

3)在上述路径中,基于提交值生成[IMAGE_NUMBER]。因此,上传的第一张图片的标题为1.jpg,第二张图片的标题为2.jpg等...

因此,为了此问题的目的构建一个示例目录,结构可能如下所示:

../images-->
    ../10/1.jpg
    ../10/2.jpg
    ../10/3.jpg
    ../11/4.jpg
    ../11/5.jpg
    ../10/6.jpg
    ../11/7.jpg

所以在这种情况下,User #10上传了3张图片,然后退出了。一直到User #11,她在登出前上传了2张图片。最后,User #10重新登录并上传另一张图片。

好了,现在我们已经生成了目录的摘要并且动态输入了图像,让我来看看最终的问题。我希望能够在用户点击我们将调用btnRefresh的按钮时在iphone的视图上显示所有图像的缩略图

以下是与btnRefresh

相关联的方法
-(IBAction)btnRefreshTapped
{
[self refreshStream];
}
-(void)refreshStream {
[[API sharedInstance] commandWithParams:[NSMutableDictionary dictionaryWithObjectsAndKeys:
                                         @"stream",@"command",
                                         nil]
                           onCompletion:^(NSDictionary *json) {
                               [self showStream:[json objectForKey:@"result"]];
                           }];
}

正如您所看到的,这是引用API sharedInstance的方法:

+(API*)sharedInstance
{
static API *sharedInstance = nil;
static dispatch_once_t oncePredicate;
dispatch_once(&oncePredicate, ^{
    sharedInstance = [[self alloc] initWithBaseURL:[NSURL URLWithString:kAPIHost]];
});
    return sharedInstance;
}

最后我们来到URLWithString值:

-(NSURL*)urlForImageWithId:(NSNumber*)IdPhoto isThumb:(BOOL)isThumb {

int IdValue = [[user objectForKey:@"id"] intValue];

NSString* urlString = [NSString stringWithFormat:@"%@/%@upload/%d/%@%@.jpg",
                       kAPIHost, kAPIPath, IdValue, IdPhoto, (isThumb)?@"-thumb":@""
                       ];
return [NSURL URLWithString:urlString];
}

所以,这就是我的问题。由于目前正在定义,我只能看到用户点击btnRefresh时登录到应用的图片。由于URL损坏,其他图像位置显示为灰色图像。那么,如何重新定义IdValue以循环浏览可用文件夹并拉出相关图像进行显示?

我知道这是一个复杂的问题,所以,谢谢你将一些智力投入到解决方案中。

2 个答案:

答案 0 :(得分:0)

我不知道你问的是什么,但你可以通过这段代码从目录中获取所有文件:

NSArray *contents = [fileManager contentsOfDirectoryAtURL:YourURL
                               includingPropertiesForKeys:@[] // <-Add key/s if needed
     options:NSDirectoryEnumerationSkipsHiddenFiles error:nil];

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"pathExtension == 'jpg'"];
for (NSURL *fileURL in [contents filteredArrayUsingPredicate:predicate])
{
    // Enumerate each .jpg file in directory
}

您可以指定图像目录,您应该能够找到图像并获取URL。

另一种方式是递归枚举目录中的文件,它更强大,可以根据您的要求进行修改:

NSDirectoryEnumerator *enumerator = [fileManager enumeratorAtURL:YOURURL
                                      includingPropertiesForKeys:@[NSURLNameKey, NSURLIsDirectoryKey] // <-Add more key if needed
                                                         options:NSDirectoryEnumerationSkipsHiddenFiles
                                                    errorHandler:^BOOL(NSURL *url, NSError *error)
{
    NSLog(@"Error %@", error);
}];

NSMutableArray *mutableFileURLs = [NSMutableArray array];
for (NSURL *fileURL in enumerator) {
    NSString *filename;
    [fileURL getResourceValue:&filename forKey:NSURLNameKey error:nil];

    NSNumber *isDirectory;
    [fileURL getResourceValue:&isDirectory forKey:NSURLIsDirectoryKey error:nil];

    if (![isDirectory boolValue]) {
        [mutableFileURLs addObject:fileURL];
    }
}

希望其中一个对你有用。

答案 1 :(得分:0)

修改Greg刚刚回答的内容,以便您不必迭代数组。

NSArray *paths = [fileManager contentsOfDirectoryAtURL:YourURL
                            includingPropertiesForKeys:@[]
                                               options:NSDirectoryEnumerationSkipsHiddenFiles error:nil];

NSPredicate *predicate = [NSPredicate predicateWithFormat:
                         [NSString stringWithFormat:
                          @"self ENDSWITH '/filename.jpg'"]];

NSArray *filteredArray = [paths filteredArrayUsingPredicate:predicate];
if ([newarray lastObject]) {
    //you have your path here
}

filename.jpg是代码中的IdPh​​oto.jpg。由于您拥有的数据类型,此代码可以正常工作。我在filename.jpg中包含了“/”,因此在检测110.jpg vs 10.jpg时没有问题。