как кэшировать XML-данные на iphone

#iphone #ios #asihttprequest

#iPhone #iOS #asihttprequest

Вопрос:

Я пытаюсь использовать ASIDownloadCache из библиотеки ASIHTTPRequest. Я думаю, что у меня это почти настроено, но данные, которые я печатаю в журнале, представляют собой набор чисел.. Я думаю, что это может быть проблема с форматированием .. но я хотел бы сначала передать ее кому-нибудь с большим опытом, чтобы убедиться, что я делаю это правильно, а затем, надеюсь, помочь мне устранить проблему.

Приведенный ниже код показывает вам, как я настраиваю свой кэш, я использую это представление для нескольких наборов данных, следовательно, необходимо использовать оператор if, чтобы я настраивал кэш только для определенных данных.

 - (IBAction)setRequestString:(NSString *)string
{
    //Set database address
    NSMutableString *databaseURL = [[NSMutableString alloc] initWithString:@"http://***.***.***.***:8888/codeData/"]; // iphone development

    //PHP file name is being set from the parent view
    [databaseURL appendString:string];

    //call ASIHTTP delegates (Used to connect to database)
    NSURL *url = [NSURL URLWithString:databaseURL];

    checkDataSet = [[NSString alloc] initWithFormat:string];  //Loads ICMfg.xml into checkDataSet for setting up cache

    //Create If statments here
    if ([checkDataSet isEqualToString:@"ICMfg.xml"]) {     

        //Cache stuff goes in here
        ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];
        [request setDownloadCache:[ASIDownloadCache sharedCache]];
        [request setCacheStoragePolicy:ASICachePermanentlyCacheStoragePolicy];
        [request setCachePolicy:ASIOnlyLoadIfNotCachedCachePolicy];
        [request setSecondsToCache:60*60*24*30]; // Cache for 30 days

        [request setDelegate:self]; // A delegate must be specified
        [request startSynchronous];
        //[request setDidFinishSelector:@selector(requestFinished:)]; // And an appropriate

    }
    else 
    {
    //this else statments lets all of the other datasets come through here
    ASIFormDataRequest *request = [ASIFormDataRequest requestWithURL:url];

    [request setDelegate:self];
    [request startAsynchronous];
    }

}
  

Отсюда, когда [checkDataSet равен по умолчанию:@»ICMfg.xml «] верно, он установит параметры кэша, а затем вызовет следующий метод, в котором я получаю все готовое для анализа моей информации

 - (void)requestFinished:(ASIHTTPRequest *)request
{   
    if ([checkDataSet isEqualToString:@"ICMfg.xml"]) {
        BOOL success = [request didUseCachedResponse];
        NSLog(@"------------>>>>>>> Success is %@n", (success ? @"YES" : @"NO"));


        responseString = [request responseString];        
        capturedResponseData = [responseString dataUsingEncoding:NSUTF8StringEncoding]; 

        NSLog(@"%@", capturedResponseData); //this prints out the weird data.

        [self startTheParsingProcess:capturedResponseData];

    }
    else
    {
    responseString = [request responseString]; //Pass requested text from server over to NSString 
    capturedResponseData = [responseString dataUsingEncoding:NSUTF8StringEncoding]; 

    [self startTheParsingProcess:capturedResponseData];
    }
}
  

Отсюда я проверяю свой nslog, чтобы увидеть результат этого NSLog, и он выдает кучу чисел, ниже приведен небольшой раздел выходных данных. Следующий шаг для меня — проверить, действительно ли что-то анализируется .. а также посмотреть, работает ли кэш или нет .. затем мне нужно выяснить, надеюсь, с вашей помощью, как правильно форматировать данные, если это моя главная проблема..

также я хотел бы спросить, как заставить это работать асинхронно, поскольку в настоящее время я могу заставить это работать только синхронно.

 2011-11-09 09:29:55.216 code[3968:207] ------------>>>>>>> Success is YES
2011-11-09 09:29:55.239 code[3968:207] <3c3f786d 6c207665 7273696f 6e3d2231 2e302220 656e636f 64696e67 3d225554 462d3822 3f3e0d0a 3c494345 6e673e3c 52657375 6c742044 42566572 73696f6e 3d223132 33223e3c 5461626c 65733e3c 5461626c 65205461 626c654e 616d653d 2249434d 6667223e 3c526f77 733e3c52 6f77204d 414e5546 41435455 52455249 443d2237 30362220 4d414e55 46414354 55524552 3d22412d 445a4722 2049534c 4f434b4d 414e5546 41435455 5245523d 22462220 49535645 4849434c 453d2246 223e3c2f 526f773e 3c526f77 204d414e 55464143 54555245 5249443d 22333138 22204d41 4e554641 43545552 45523d22 412e522e 452e2220 49534c4f 434b4d41 4e554641 43545552 45523d22 46222049
  

буду признателен за любую помощь.

Ответ №1:

Я не вижу ничего, что сразу бросается в глаза в вашем коде как неправильное.

NSLog() Печатается NSData объект, представляющий собой двоичные данные, поэтому шестнадцатеричные числа, которые вы видите, являются представлениями байтов, что является именно тем, что вы ожидаете.

Ссылка на класс NSData:

Описание

Возвращает объект NSString, который содержит шестнадцатеричное представление содержимого получателя.

  • (NSString *)описание

Возвращаемое значение

Объект NSString, который содержит шестнадцатеричное представление содержимого получателя в формате списка свойств NSData.

Если вы хотите распечатать строковое представление этих данных, используйте:

 NSString *capturedResponseString = [NSString stringWithUTF8String:[capturedResponseData bytes]];
  

Комментарии:

1. круто, это сработало.. также сразу после этого я попробовал nslog (@»% @», [request responseString]); и это тоже сработало 🙂 Наконец, я добился этого, вызвав startsynchronous вместо startSynchronous