我有一个以下列方式构建的文件结构。
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
以循环浏览可用文件夹并拉出相关图像进行显示?
我知道这是一个复杂的问题,所以,谢谢你将一些智力投入到解决方案中。
答案 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是代码中的IdPhoto.jpg。由于您拥有的数据类型,此代码可以正常工作。我在filename.jpg中包含了“/”,因此在检测110.jpg vs 10.jpg时没有问题。