关于iPhone:NSScanner可在WiFi上运行,但不能在3G上运行

NSScanner working on WiFi but not 3G

我已经设置了NSScanner来使用以下代码在UIButton的轻敲上工作:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
-(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><strong1><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连接上的按钮,则所有标签都显示" Not Available ",因为结果为" NULL "。这很奇怪,因为我一次将UIWebView放在所有内容的最前面,以测试该页面是否实际加载和加载,就像它在WiFi上一样。由于某些原因,NSScanner无法在3G上运行。

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


我有两件事要说。首先,您使用扫描仪之类的东西确实很棘手。如果您要解析HTML,则应该以正确的方式进行。使用libxml2(iPhone内置)之类的东西来实际解析html并从中获取内容。老实说,您的系统可能会因进行少量更新而中断,或者页面出现故障。

已经足够了,但是如果您决定保留当前系统,则可以尝试从当前加载的页面中检索实际的html。

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

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

由于可以加载Web视图,因此您应该能够像这样从加载的Web视图中获取内容。

如果我可以补充,那就行不通了:else if(Period1Data == @"(null)")。调试器打印(null),但是如果字符串为null,则永远不会显示为(null)。而且,如果您正在比较字符串,那么您可能正在做isEqualToString:,但是我已经不知所措了。 ;)