0

次のハックジョブ コードを使用して、アプリケーションで使用するためにサーバーからデータをダウンロードする一連の SOAP 要求を実行します。

このコードは、「更新」ボタンが押されたときに呼び出されます。

- (IBAction) update {
    UIAlertView *errorView;

    if([[Reachability reachabilityForInternetConnection] currentReachabilityStatus] == NotReachable) {
        errorView = [[UIAlertView alloc] 
                     initWithTitle: @"Network Error" 
                     message: @"No Network connection availible!" 
                     delegate: self 
                     cancelButtonTitle: @"OK" otherButtonTitles: nil]; 
        [errorView show];
    }
    else
    {
        [appDelegate.categories removeAllObjects];
        [appDelegate.currencies removeAllObjects];
        [appDelegate.projects removeAllObjects];

        HUD = [MBProgressHUD showHUDAddedTo:self.navigationController.view animated:YES];
        HUD.labelText = @"Downloading..";

        [self requestCategories];
    }
}

以下は典型的なリクエストです。私はそのうちの約 6 つを使用します。

// SOAP requests
- (void) requestCategories {
    // Indeterminate mode
    categories = [[NSMutableArray alloc] init];
    xmlBlock = CATEGORY;
    NSString *soapMsg =
    [NSString stringWithFormat:
     @"<?xml version=\"1.0\" encoding=\"utf-8\"?> <soap:Envelope xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\"> <soap:Body> <Categories xmlns=\"http://tempuri.org/\"> <UID>string</UID> <Username>string</Username> <Password>string</Password> </Categories>      </soap:Body> </soap:Envelope>"
     ];
    //---print it to the Debugger Console for verification---
    NSLog(@"%@", soapMsg);
    NSURL *url = [NSURL URLWithString:
                  @"http://www.$$%$%^^^%$$££.co.uk/%$^£^£^$&£.asmx"];
    NSMutableURLRequest *req = [NSMutableURLRequest requestWithURL:url];
    //---set the headers---
    NSString *msgLength = [NSString stringWithFormat:@"%d",
                           [soapMsg length]];
    [req addValue:@"text/xml; charset=utf-8"
forHTTPHeaderField:@"Content-Type"];
    [req addValue:@"http://tempuri.org/Categories"
forHTTPHeaderField:@"SOAPAction"];
    [req addValue:msgLength forHTTPHeaderField:@"Content-Length"];
    //---set the HTTP method and body---
    [req setHTTPMethod:@"POST"];
    [req setHTTPBody: [soapMsg dataUsingEncoding:NSUTF8StringEncoding]];
    //[activityIndicator startAnimating];
    conn = [[NSURLConnection alloc] initWithRequest:req delegate:self];
    if (conn) {
        webData = [NSMutableData data];
    }

}

以下は、NSURLConnection のデリゲート メソッド (および解析メソッド) です。

-(void) connection:(NSURLConnection *) connection
didReceiveResponse:(NSURLResponse *) response {
    [webData setLength: 0];
}

-(void) connection:(NSURLConnection *) connection
    didReceiveData:(NSData *) data {
    [webData appendData:data];
}

-(void) connection:(NSURLConnection *) connection
  didFailWithError:(NSError *) error {

}

-(void) connectionDidFinishLoading:(NSURLConnection *) connection {
    NSLog(@"DONE. Received Bytes: %d", [webData length]);
    NSString *theXML = [[NSString alloc]
                        initWithBytes: [webData mutableBytes]
                        length:[webData length]
                        encoding:NSUTF8StringEncoding];
    //---shows the XML---
    NSLog(@"%@", theXML);

    if (xmlBlock == CATEGORY){
        [self parseXML:webData];

        [self requestCurrencies];
    }
    else if (xmlBlock == CURRENCY){
        [self parseXML:webData];

        [self requestNominals];
    }
    else if (xmlBlock == NOMINAL){
        [self parseXML:webData];

        [self requestProjects];
    }
    else if (xmlBlock == PROJECT){
        [self parseXML:webData];

        [self requestRegister];
    }
    else {
        [self parseXML:webData];

        HUD.customView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"37x-Checkmark.png"]];
        HUD.labelText = @"Done!";
        HUD.mode = MBProgressHUDModeCustomView;
        [HUD hide:YES afterDelay:2];
    }

}

- (void) parseXML: (NSMutableData *)localWebData {
    xmlParser = [[NSXMLParser alloc] initWithData: localWebData];
    [xmlParser setDelegate: self];
    [xmlParser setShouldResolveExternalEntities:YES];
    [xmlParser parse];
}

私のxml解析デリゲートメソッドを見る必要はないと思います(もしあなたが私に知らせてくれれば)。私の質問は、この機能をアプリに実装するより良い方法はありますか? ユーザーにある種の進行状況インジケーターを表示しながら、リクエストを次々と実行するのと同じように?

ありがとう、

ジャック

4

1 に答える 1

2

NSOperation キューを使用します。つまり、クラスをサービスにリクエストを送信する NSOperation のサブクラスにし、メソッドの名前を main に変更します。次に、このクラスのプロパティを親クラスに作成し、すべてのリクエストを操作キューに追加します。最後に、nsopertion サブクラスのプロパティに keyobserver を使用します。

于 2012-05-18T14:10:12.367 に答える