NSScanner使用WiFi,但不支持3G

我build立了一个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连接上的button,所有标签显示“不可用”,因为结果是“NULL”。 这很奇怪,因为我把UIWebView放在一切的前面,以testing页面是否实际加载了,就像在WiFi上一样。 出于某种原因,NSScanner不能使用3G。

为什么会这样? 只要告诉我,如果有任何其他代码你需要看到…

我有几件事要说。 首先,你用扫描仪和东西做什么真的很hacky。 如果你想parsingHTML,你应该以正确的方式做。 使用像libxml2 (内置到iPhone中)来实际parsing html并从中获取内容。 老实说,你的系统可能会因为页面的更新或者故障而中断。

足够的咆哮,但如果你决定离开你的当前系统,你可以尝试从当前加载的页面检索实际的HTML。

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

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

由于您的网页视图可以加载,那么你应该能够像这样从加载的web视图抓取内容。

如果我可以添加,这是行不通的: else if(Period1Data == @"(null)") 。 debugging器打印(null) ,但如果一个string为null,它永远不会出现(空)。 如果你比较string,你会做isEqualToString:但是我正在逃避我自己。 ;)