1

ここ数日、私を悩ませている問題がありました。

RSS フィードを NSXMLParser で解析し、結果を UITableView にフィードしています。残念ながら、フィードは次のメソッドで解析する HTML を返します。

- (NSString *)flattenHTML:(NSString *)html {

NSScanner *theScanner;
NSString *text = nil;
theScanner = [NSScanner scannerWithString:html];
while ([theScanner isAtEnd] == NO) {
    [theScanner scanUpToString:@"<" intoString:NULL] ;
    [theScanner scanUpToString:@">" intoString:&text] ;
    html = [html stringByReplacingOccurrencesOfString:[NSString stringWithFormat:@"%@>", text] withString:@""];
}
html = [html stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];

return html;

}

現在、NSXMLParser デリゲート メソッドでこのメソッドを呼び出しています。

- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName{

これは美しく機能しますが、HTML を解析してテキストにフラット化し、セルを埋めるのにほぼ 1 分以上かかります。その非常に長い間、私の UITableView は完全に空で、スピナーが 1 つだけ回転しています。それは良いことではありません。これは、そうでなければ素晴らしく機能するアプリを出荷する前に、つぶす最後の「バグ」です。

驚くべきことではありませんが、iOS シミュレーターでかなり速く動作します。

アドバイスをよろしくお願いします。

4

3 に答える 3

0

何が問題なのかよくわかりません。flattenHTML完成までに時間がかかるということですか?または、実行中にアプリをブロックしているということですか?

最後の問題があなたの問題であり、あなたがすべてを正しく行っていてflattenHTML、完了するのに本当に長い時間がかかると仮定した場合。あなたができる唯一のことは、これをしている間あなたがあなたのメインスレッドをブロックしていないことを確認することです。GCDまたはNSOperationを使用してこれを実現できます。現在データを解析していることをユーザーに通知し、操作を待機するかキャンセルして他のことを行うかをユーザーに決定させる以外にできることはありません。

于 2012-08-05T09:02:32.707 に答える
0

私は同様の問題を入力しましたが、それを速くすることはできませんでした。これの代わりに、進行状況バーを表示して、解析プロセスがどのように行われたかを示しました。

ss

以下のコードはその一部です。

// at first, count the lines of XML file
NSError *error = nil;
NSString *xmlFileString = [NSString stringWithContentsOfURL:url
                                                   encoding:NSUTF8StringEncoding
                                                      error:&error];
_totalLines = [xmlFileString componentsSeparatedByString:@"\n"].count;

// do other things...

// delegate method when the parser find new section
- (void)parser:(NSXMLParser *)parser 
didStartElement:(NSString *)elementName 
  namespaceURI:(NSString *)namespaceURI 
 qualifiedName:(NSString *)qName 
    attributes:(NSDictionary *)attributeDict
{
    // do something ...

    // back to main thread to change app appearance
    NSOperationQueue *mainQueue = [NSOperationQueue mainQueue];
    [mainQueue addOperationWithBlock:^{

        // Here is important. Get the line number and update the progress bar.
        _progressView.progress = (CGFloat)[parser lineNumber] / (CGFloat)_totalLines;
    }];
}

GitHub にサンプル プロジェクトがあります。ダウンロードして実行するだけです。私のコードがあなたに役立つことを願っています。

https://github.com/weed/p120727_XMLParseProgress

于 2012-08-05T06:05:46.043 に答える