0

我使用以下 hack-job 代码执行一系列 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 回答