2012-02-17 24 views
1

私はiPhoneアプリケーションを開発していて、xmlパーサーに問題があります。私は複数のXMLファイルから複数の値をチェックする必要がありますが、XMLパーサがアクティブなときは何もできません。これは、xmlのチェックが気づかれることなくバックグラウンドで行われなければならないので、私が望む方法ではありません。ここで私のコードのいくつかは、それが十分であることを願っています!XML Parser Xcodeが本当に遅い

appDelegate.datavalues = [[NSMutableArray alloc] init]; 
for(int i = 0; i < [headarray count]; i++){ 
    NSMutableArray *infoarray = [[NSMutableArray alloc]initWithArray:[headarray objectAtIndex:i]]; 
    NSString *IP = [infoarray objectAtIndex:1]; 
    NSString *Unique = [infoarray objectAtIndex:2]; 
    NSString *Port = [infoarray objectAtIndex:3]; 
    NSString *relay = (NSString *)[infoarray objectAtIndex:4]; 
    NSString *input = (NSString *)[infoarray objectAtIndex:5]; 
    NSLog(@"relay%@",relay); 
    NSString *urlAddress = [NSString stringWithFormat:@"http://%@:%@/state.xml",IP,Port]; 
    NSURL *url = [NSURL URLWithString:urlAddress]; 
    NSString *authHeader = [NSString stringWithFormat:@"Basic %@",Unique]; 
    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url 
                  cachePolicy:NSURLRequestReloadIgnoringCacheData timeoutInterval: 3]; 
    [request setValue:authHeader forHTTPHeaderField:@"Authorization"]; 
    //NSURLConnection *connectionResponse = [[NSURLConnection alloc] initWithRequest:request delegate:self]; 
    NSURLResponse *myURLResponse; 
    NSError *myError; 

    NSData* myDataResult = [NSURLConnection sendSynchronousRequest: request returningResponse:&myURLResponse error:&myError]; 


    NSXMLParser *xmlParser = [[NSXMLParser alloc] initWithData:myDataResult]; 
    XMLParser *parser = [[XMLParser alloc] initXMLParser]; 
    //parser.relay = [infoarray objectAtIndex:4]; 
    //Set delegate 
    [xmlParser setDelegate:parser]; 
    //Start parsing the XML file. 
    BOOL success = [xmlParser parse]; 

この後、私はいくつかの値をチェックしますので、表示する必要はないと思います!

答えて

0

NSOperationおよびNSOperationQueue APIおよび/または並行処理プログラミングガイドを参照してください。 (どちらもXcodeライブラリにあります)。ドキュメントから

NSOperationQueueクラスは NSOperationオブジェクトのセットの実行を制御します。キューに追加された後、操作 は明示的に取り消されるか、または がそのタスクを実行するまで、そのキューに残ります。キュー内のオペレーション(ただし、 が実行されていない)は、優先順位レベルと オペレーション間のオブジェクト依存性に従って編成され、それに応じて実行されます。 アプリケーションは、複数の操作キューを作成し、いずれかに操作 を送信することがあります。あなたが別のメソッドにXML関連のコードをリファクタリングができ、その後、あなたは、バックグラウンドでメソッドを実行するために、グランドセントラル派遣を使用することができます

+0

、あなたがキャンセルするための最良の方法は何か知っていますそれ?? – kjeldGr

+0

キャンセルするときにフラグを設定します。あなたの 'XMLParser'がフラグをチェックして、それが設定されていれば' [xmlParser abortParsing] 'を実行してください。 –

1

- (void) startOperation 
{ 
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_NORMAL, 0), ^{ 
     [self runSomeXMLChecks]; 
     dispatch_sync(dispatch_get_main_queue(), ^{ 
      // This is dispatched on the main queue so that 
      // you can update the UI. The NSLog is just an example. 
      NSLog(@"XML check done!"); 
     }); 
    }); 
} 
関連する問題