好的,在我的应用程序中,我正在获取包含我需要下载的一些图像的URL的json对象。我使用下面的代码执行所有操作,正在下载图像并将其保存到我创建的tmp / Assets /目录中,但在重新启动应用程序之前,NSFileManager不会看到它们。我的意思是,文件在那里,我可以使用组织器看到它们,就像我做的文件管理器在我再次启动应用程序之前看不到它们。 nsfilemanager是否有某种刷新功能?
- (void)updateResizeableAssets{
NSString* tempDirectory = NSTemporaryDirectory();
tempDirectory = [tempDirectory stringByAppendingString:@"Assets/"];
if(![[NSFileManager defaultManager] fileExistsAtPath:tempDirectory isDirectory:nil])
{
[[NSFileManager defaultManager] createDirectoryAtPath:tempDirectory withIntermediateDirectories:YES attributes:nil error:nil];
}
NSURLRequest *requestResizeable = [NSURLRequest requestWithURL:[NSURL URLWithString:@"http://someurl.com/"]];
[NSURLConnection sendAsynchronousRequest:requestResizeable queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse *response, NSData* data, NSError *connectionError){
NSError *jsonParsingError = nil;
NSDictionary *arrayOfImages;
NSArray *object = [NSJSONSerialization JSONObjectWithData:data options:0 error:&jsonParsingError];
for(int i=0; i<[object count];i++)
{
arrayOfImages= [object objectAtIndex:i];
NSString *imageStringUrl = @"http://someotherurl.com/";
imageStringUrl = [imageStringUrl stringByAppendingString:(NSString*)[arrayOfImages objectForKey:@"name"]];
NSURLRequest *imageUrl = [NSURLRequest requestWithURL:[NSURL URLWithString:imageStringUrl]];
if(![[NSFileManager defaultManager] fileExistsAtPath:[tempDirectory stringByAppendingString:[arrayOfImages objectForKey:@"name"]]])
{
[NSURLConnection sendAsynchronousRequest:imageUrl queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse *response, NSData* data, NSError *connectionError){
[[NSFileManager defaultManager] createFileAtPath:[tempDirectory stringByAppendingString:[arrayOfImages objectForKey:@"name"]] contents:data attributes:Nil];
}];
}
//NSLog(@"Image: %@", [arrayOfImages objectForKey:@"name"]);
}
NSString* tempDirectory = NSTemporaryDirectory();
tempDirectory = [tempDirectory stringByAppendingString:@"Assets/"];
NSArray *files = [[NSFileManager defaultManager] contentsOfDirectoryAtPath:tempDirectory error:nil];
for(int i=0; i<[files count]; i++)
{
//HERE I GOT NOTHING UNTIL I RESTART THE APP (Run App twice)
NSLog(@"%@", [files objectAtIndex:i]);
}
}];
}
答案 0 :(得分:2)
这是我的方法: 块中的代码是异步调用的,所以当你到达这个部分时:
[NSURLConnection sendAsynchronousRequest:imageUrl queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse *response, NSData* data, NSError *connectionError){
[[NSFileManager defaultManager] createFileAtPath:[tempDirectory stringByAppendingString:[arrayOfImages objectForKey:@"name"]] contents:data attributes:Nil];
}];
执行继续,这意味着主要块在第二个块完成其工作之前终止。
所以将其余代码放在NSURLConnection块中:
[NSURLConnection sendAsynchronousRequest:imageUrl queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse *response, NSData* data, NSError *connectionError){
[[NSFileManager defaultManager] createFileAtPath:[tempDirectory stringByAppendingString:[arrayOfImages objectForKey:@"name"]] contents:data attributes:Nil];
NSString* tempDirectory = NSTemporaryDirectory();
tempDirectory = [tempDirectory stringByAppendingString:@"Assets/"];
NSArray *files = [[NSFileManager defaultManager] contentsOfDirectoryAtPath:tempDirectory error:nil];
for(int i=0; i<[files count]; i++)
{
//HERE I GOT NOTHING UNTIL I RESTART THE APP (Run App twice)
NSLog(@"%@", [files objectAtIndex:i]);
}
}];
我希望这会有所帮助:)。
<强>被修改强>
使用块时,很难理解发生了什么,问题是你是在一个块内创建文件而那个块在for循环中所以当你提出第一个请求i = 0时,然后你的请求可能需要一段时间才能给出响应,这意味着您的循环将继续(不会等待您的第一个请求)所以当i = 1时,您的第一个请求可能尚未完成,因此您的第一个文件尚未创建。
如果您要使用块并且需要等待响应,则需要从块内部调用所有请求,然后使用递归方法。
我建议你使用委托方法,它可以更多的工作,但你可以更好地控制正在发生的事情。
http://codewithchris.com/tutorial-how-to-use-ios-nsurlconnection-by-example/