0

マルチスレッドは初めてで、この関数をバックグラウンドで実行するにはどうすればよいか疑問に思っていました。この関数は、XML 解析に使用され、別の関数から呼び出される NSURL を返すだけです。または、それを呼び出す関数は、この関数が NSURL を返すまで続行しないため、バックグラウンドで実行する価値さえあります。基本的に、完了するのに少し時間がかかるので、これをスピードアップする方法を見つけようとしています!

+ (NSURL *)parserURL {

    NSURL *theURL = [NSURL URLWithString:@"http://www.wccca.com/PITS/"];
    NSData *data = [[NSData alloc] initWithContentsOfURL:theURL];
    TFHpple *xpathParser = [[TFHpple alloc] initWithHTMLData:data];
    NSArray *elements = [xpathParser searchWithXPathQuery:@"//input[@id='hidXMLID']//@value"];
    if (elements.count >= 1) {

        TFHppleElement *element = [elements objectAtIndex:0];
        TFHppleElement *child = [element.children objectAtIndex:0];
        NSString *idValue = [child content];

        NSString *stg = [NSString stringWithFormat:@"http://www.wccca.com/PITS/xml/fire_data_%@.xml", idValue];
        NSURL *url = [NSURL URLWithString:stg];

        return url;
    }
    return nil;
}
4

1 に答える 1

1

コードの主な問題は、ブロック操作を使用して Web サイトからデータを取得していることです。これは必ずバックグラウンド スレッドで実行する必要があります。ただし、これらの種類の操作を非常に簡単に行うのに役立つネットワーク フレームワーク、つまりAFNetworkingを確認することをお勧めします。

いずれにせよ、その操作または同様の操作をマルチスレッド化するために従う戦略は次のとおりです。 GDCを使用してディスパッチし、受信完了ブロックを実行して結果をメインスレッドに戻します。

コードは次のとおりです。

説明

まず、ブロックを受け取る関数を宣言することから始めます。データの取得と解析が完了すると、ブロックが最後に実行されます。コードが次に行うことは、バックグラウンド キューでコード ブロックを実行するように GDC に要求することです。完了したら、メイン スレッドで関数のパラメーターとして提供された完了ブロックを実行し、解析済みの文字列を提供するようにコードに要求します。

+(void) parserURL:(NSURL *) theURL completion:(void (^) (NSURL *finalURL))completionBlock{
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{

    NSData *data = [[NSData alloc] initWithContentsOfURL:theURL];
    TFHpple *xpathParser = [[TFHpple alloc] initWithHTMLData:data];
    NSArray *elements = [xpathParser searchWithXPathQuery:@"//input[@id='hidXMLID']//@value"];
    NSURL *url;
    if (elements.count >= 1) {

        TFHppleElement *element = [elements objectAtIndex:0];
        TFHppleElement *child = [element.children objectAtIndex:0];
        NSString *idValue = [child content];

        NSString *stg = [NSString stringWithFormat:@"http://www.wccca.com/PITS/xml/fire_data_%@.xml", idValue];
        url = [NSURL URLWithString:stg];
    }else{
        url = nil;
    }
        dispatch_async(dispatch_get_main_queue(), ^{
            completionBlock(url);
        });
    });

}

次の方法でメソッドを呼び出します。

[URLParser parserURL:[NSURL URLWithString:@"http://www.wccca.com/PITS/"] completion:^(NSURL *finalURL) {
        NSLog(@"Parsed string %@", [finalURL absoluteString]);
    }];
于 2013-04-23T16:14:56.040 に答える