【问题标题】:NSScanner working on WiFi but not 3GNSScanner 在 WiFi 但不是 3G 上工作
【发布时间】:2012-01-20 10:53:14
【问题描述】:

我已经使用以下代码设置了一个 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。

为什么会这样?只要告诉我您是否需要查看任何其他代码...

【问题讨论】:

  • 检查 loaderror 以查看加载内容时是否出现任何问题。还要检查返回的字符串并确保它是您所期望的。
  • 对不起,如果这听起来很傻,但我该怎么做呢?
  • 设置断点并将鼠标悬停在变量上,或者NSLog(@"Error: %@", loaderror);
  • 错误是这样的:pastie.org/3022008 - 为什么会这样?

标签: iphone objective-c ios xcode nsscanner


【解决方案1】:

我有几件事要说。首先,你用扫描仪和其他东西做的事情真的很hacky。如果您尝试解析 HTML,则应该以正确的方式进行。使用类似libxml2(iPhone 内置)之类的东西来实际解析 html 并从中获取内容。老实说,您的系统可能会因页面的小更新或故障而中断。

咆哮到此为止,但如果您决定保留当前系统,则可以尝试从当前加载的页面中检索实际的 html。

例如(正如我已经在您的其他问题中发布的那样):

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

既然您的网页视图可以加载,那么您应该能够像这样从加载的网页视图中获取内容。

如果我可以添加,这将不起作用:else if(Period1Data == @"(null)")。调试器打印(null),但如果字符串为空,它永远不会显示为(空)。如果你在比较字符串,你会做isEqualToString:,但我自己逃跑了。 ;)

【讨论】:

  • 谢谢!到此为止,我还需要做什么? pastie.org/3026712
  • 这是你必须弄清楚的事情!你是开发者,你知道的。 ;)
  • 我知道,只需要一点指导,然后我就可以继续完善它。我在这里找到了几乎所有代码(方法略有不同):stackoverflow.com/questions/1343515/… 但不确定哪个代码实际保存了文件 - 是第一个答案最底部的代码吗?
  • 你想做什么?您是否正在尝试将 html 实际保存到磁盘?我只是看了你的代码,你完全误解了我刚刚在上面发布的内容。我们通过评估 javascript is 创建的 *html 变量是 html 内容。你不需要做stringWithContentsOfURL:pastie.org/3026856
  • 有没有办法可以处理超时过程,因为如果我的连接不好,整个应用程序会崩溃,因为它无法检索数据?你能发布一个例子吗?谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-09-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多