NSScanner работает по WiFi, но не 3G - PullRequest
0 голосов
/ 14 декабря 2011

Я настроил NSScanner для работы на кран UIButton со следующим кодом:

-(IBAction)doLoadTTData
{

NSString *Period1String = [NSString stringWithContentsOfFile:[[NSBundle mainBundle] pathForResource: @"Period1String" ofType: @"txt"] usedEncoding:nil error:nil];
NSString *Period2String = [NSString stringWithContentsOfFile:[[NSBundle mainBundle] pathForResource: @"Period2String" ofType: @"txt"] usedEncoding:nil error:nil];
NSString *Period3String = [NSString stringWithContentsOfFile:[[NSBundle mainBundle] pathForResource: @"Period3String" ofType: @"txt"] usedEncoding:nil error:nil];
NSString *Period4String = [NSString stringWithContentsOfFile:[[NSBundle mainBundle] pathForResource: @"Period4String" ofType: @"txt"] usedEncoding:nil error:nil];
NSString *Period5String = [NSString stringWithContentsOfFile:[[NSBundle mainBundle] pathForResource: @"Period5String" ofType: @"txt"] usedEncoding:nil error:nil];

NSURL *currentURL = [NSURL URLWithString:webView.request.URL.absoluteString];
NSLog(@"Loaded Timetable");
NSError *loaderror;
NSString *page = [NSString stringWithContentsOfURL:currentURL 
                                          encoding:NSASCIIStringEncoding
                                             error:&loaderror];

[webView loadHTMLString:page baseURL:currentURL];

NSString *Period1Data = nil;

NSScanner *htmlScanner =  [NSScanner scannerWithString:page];

[htmlScanner scanUpToString:Period1String intoString:NULL];
[htmlScanner scanString:Period1String intoString:NULL];
[htmlScanner scanUpToString:@"</FONT>" intoString:&Period1Data];

NSLog(@"Collected Period 1 Data: %@", Period1Data);

if(Period1Data == NULL)
{

    Period1Data = @"Not Available";
    [period1label setText:@"Not Available"];

}

else if(Period1Data == @"(null)")
{

    Period1Data = @"Not Available";
    [period1label setText:@"Not Available"];

}

else

{

    [period1label setText:Period1Data];

}

NSString *Period2Data = nil;

[htmlScanner scanUpToString:Period2String intoString:NULL];
[htmlScanner scanString:Period2String intoString:NULL];
[htmlScanner scanUpToString:@"</FONT>" intoString:&Period2Data];

if(Period2Data == NULL)
{

    Period2Data = @"Not Available";
    [period2label setText:@"Not Available"];

}

else if(Period2Data == @"(null)")
{

    Period2Data = @"Not Available";
    [period2label setText:@"Not Available"];

}

else

{

    [period2label setText:Period2Data];
    [period2label setText:@"Not Available"];

}

NSLog(@"Collected Period 2 Data: %@", Period2Data);

NSString *Period3Data = nil;

[htmlScanner scanUpToString:Period3String intoString:NULL];
[htmlScanner scanString:Period3String intoString:NULL];
[htmlScanner scanUpToString:@"</FONT>" intoString:&Period3Data];

if(Period3Data == NULL)
{

    Period3Data = @"Not Available";
    [period3label setText:@"Not Available"];

}

else if(Period3Data == @"(null)")
{

    Period3Data = @"Not Available";
    [period3label setText:@"Not Available"];

}

else

{

    [period3label setText:Period3Data];

}

NSLog(@"Collected Period 3 Data: %@", Period3Data);

NSString *Period4Data = nil;

[htmlScanner scanUpToString:Period4String intoString:NULL];
[htmlScanner scanString:Period4String intoString:NULL];
[htmlScanner scanUpToString:@"</FONT>" intoString:&Period4Data];

if(Period4Data == NULL)
{

    Period4Data = @"Not Available";
    [period4label setText:@"Not Available"];

}

else if(Period4Data == @"(null)")
{

    Period4Data = @"Not Available";
    [period4label setText:@"Not Available"];

}

else

{

    [period4label setText:Period4Data];

}

NSLog(@"Collected Period 4 Data: %@", Period4Data);

NSString *Period5Data = nil;

[htmlScanner scanUpToString:Period5String intoString:NULL];
[htmlScanner scanString:Period5String intoString:NULL];
[htmlScanner scanUpToString:@"</FONT>" intoString:&Period5Data];

if(Period5Data == NULL)
{

    Period5Data = @"Not Available";
    [period5label setText:@"Not Available"];

}

else if(Period5Data == @"(null)")
{

    Period5Data = @"Not Available";
    [period5label setText:@"Not Available"];

}

else

{

    [period5label setText:Period5Data];

}

NSLog(@"Collected Period 5 Data: %@", Period5Data);

NSString* TimetableDate = nil;
NSString *DateString = [NSString stringWithFormat:@"<FONT size=2>&nbsp;<STRONG><FONT size=3>"];

[htmlScanner scanUpToString:DateString intoString:NULL];
[htmlScanner scanString:DateString intoString:NULL];
[htmlScanner scanUpToString:@"</FONT>" intoString:&TimetableDate];

NSString *timetablefulldate = [NSString stringWithFormat:@"Timetable for %@", TimetableDate];

[timetabledate setText:timetablefulldate];

[TimetableLoading setHidden:YES];
[TimetableLoadingBG setHidden:YES];


if(Period1Data == NULL && Period2Data == NULL && Period3Data == NULL && Period4Data == NULL && Period5Data == NULL)
{

    if(ttbacking.tag == 10)

    {

        NSLog(@"Already showing message");

    }

    else

    {

        UIAlertView *message = [[UIAlertView alloc] initWithTitle:@"Timetable"
                                                          message:@"Looks like you don't have any lessons today! Maybe you'd like to get some homework out of the way?"
                                                         delegate:nil
                                                cancelButtonTitle:@"I'll have a think"
                                                otherButtonTitles:nil];

        [message show];

        [ttbacking setTag:10];

    }

    [period1label setText:@"Free Time"];
    [period2label setText:@"Free Time"];
    [period3label setText:@"Free Time"];
    [period4label setText:@"Free Time"];
    [period5label setText:@"Free Time"];

    period1backing.image = [UIImage imageNamed:@"redperiodbacking.png"];
    period2backing.image = [UIImage imageNamed:@"redperiodbacking.png"];
    period3backing.image = [UIImage imageNamed:@"redperiodbacking.png"];
    period4backing.image = [UIImage imageNamed:@"redperiodbacking.png"];
    period5backing.image = [UIImage imageNamed:@"redperiodbacking.png"];

}

if(TimetableDate == NULL)
{

    [timetabledate setText:@"No timetable today"];

}

[prevDay setHidden:NO];
[nextDay setHidden:NO];

NSLog(@"Student Timetable collected and published");

}

К сожалению, это работает только с WiFi, но не с 3G.

Если я нажму кнопку на соединении 3G, все метки будут отображаться как «Недоступно», потому что результаты «NULL». Это странно, потому что я поставил UIWebView один раз перед всем, чтобы проверить, действительно ли страница загружена и работает, так же, как если бы она была по WiFi. По какой-то причине NSScanner не работает на 3G.

Почему это могло быть? Просто скажите, есть ли другой код, который вам нужно посмотреть ...

1 Ответ

2 голосов
/ 16 декабря 2011

У меня есть пара вещей, чтобы сказать. Во-первых, то, что вы делаете со сканерами и прочим, действительно довольно хакерское. Если вы пытаетесь разобрать HTML, вы должны делать это правильно. Используйте что-то вроде libxml2 (встроенное в iPhone), чтобы на самом деле проанализировать html и получить что-то из этого. Если честно, ваша система может сломаться с небольшим обновлением или сбоем в работе страницы.

Достаточно с разглагольствованиями, но если вы решите оставить свою текущую систему на месте, вы можете попытаться получить реальный html со страницы, загруженной в данный момент.

Например (как я уже писал в вашем другом вопросе):

NSString *path = @"document.body.innerHTML";
NSString *html = [webView stringByEvaluatingJavaScriptFromString:path];

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

И если я могу добавить, это не сработает: else if(Period1Data == @"(null)"). Отладчик печатает (null), но если строка имеет значение null, она никогда не будет отображаться как (null). И если бы вы сравнивали строки, вы бы делали isEqualToString:, но я убегаю с собой. ;)

...