NSURLRequest скачивает, NSFileManager не видит

Хорошо, в моем приложении я извлекаю объект json, который содержит URL-адреса некоторых изображений, которые мне нужно загрузить. Я делаю все это с помощью приведенного ниже кода. Изображения загружаются и сохраняются в созданный мной каталог 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]);
    }
}];

}


person jovanjovanovic    schedule 08.10.2013    source источник


Ответы (1)


Это мой подход: код в блоке вызывается асинхронно, поэтому, когда вы доберетесь до этой части:

[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/

person Goca    schedule 09.10.2013
comment
хорошо, это работает на данный момент. Я хотел получить этот файл только один раз, но когда я поставил if ((i+1) == [количество объектов]) перед поиском файлов, я ничего не получил. После регистрации я увидел, что если я поставлю if (i == 0), он отлично работает? O.o не совсем уверен, как связать это с асинхронным запросом, возможно, запрос, когда я был нулевым, завершается последним, не совсем уверен: | - person jovanjovanovic; 09.10.2013
comment
Я редактирую свой ответ, возможно, это поможет вам прояснить ситуацию. - person Goca; 09.10.2013