-2

我的带有 sendSynchronousRequest 的 NSURLConnection 代码工作正常,但我怎样才能将其更改为异步请求?我尝试了很多,但没有任何效果。

如果请求为空,我将得到一个带有 [[]] 的空数组。我怎样才能捕捉到它的警报消息?

请帮忙 ...

     [UIApplication sharedApplication].networkActivityIndicatorVisible = YES;

    NSString *urlString = @"http://www.xyz.at/sample.php";

    NSURL *url = [NSURL URLWithString:urlString];

    NSMutableURLRequest *request = [[NSMutableURLRequest alloc] init];
    [request setURL:url];
    [request setHTTPMethod:@"POST"];

    NSMutableData *body = [NSMutableData data];

    NSString *postWerte = [NSString stringWithFormat:@"id=%@", self.textfeld.text];

    [body appendData:[postWerte dataUsingEncoding:NSUTF8StringEncoding]];

    [request setHTTPBody:body];

    NSError *error = nil;
    NSData *returnData = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:&error];
    NSLog(@"Error: %@", error.description);

    NSString *returnString = [[NSString alloc] initWithData:returnData encoding:NSUTF8StringEncoding];

    const char *convert = [returnString UTF8String];
    NSString *responseString = [NSString stringWithUTF8String:convert];
    NSMutableArray *meinErgebnis = [responseString JSONValue];

    NSString *cycle = @"";

    NSString *kopfdaten = [NSString stringWithFormat:@"Sendungsart: %@\r\nGewicht: %@ kg\r\n\r\n", [[meinErgebnis objectAtIndex:0] objectForKey:@"ParcelTypeDescription"], [[meinErgebnis objectAtIndex:0] objectForKey:@"Weight"]];

    cycle = [cycle stringByAppendingString:kopfdaten];

    for(int i = 1; i < meinErgebnis.count; i++)
        {

        NSString *myValue = [NSString stringWithFormat:@"%@     PLZ: %@\r\nStatus: %@\r\n\r\n",
                [[meinErgebnis objectAtIndex:i] objectForKey:@"EventTimestamp"],
                [[meinErgebnis objectAtIndex:i] objectForKey:@"EventPostalCode"],
                [[meinErgebnis objectAtIndex:i] objectForKey:@"ParcelEventReasonDescription"]];

        cycle = [cycle stringByAppendingString:myValue];

        }
        self.ergebnis.text = [NSString stringWithFormat:@"%@", cycle];

    [UIApplication sharedApplication].networkActivityIndicatorVisible = NO;
    [self.textfeld resignFirstResponder];
4

1 回答 1

3

你可以:

  • 创建一个NSOperationQueue, 和

  • call sendAsynchronousRequest,将所有NSData处理代码放在完成块中。

因此,而不是:

NSURLResponse *response = nil;
NSError *error = nil;
NSData *data = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error];

// now process resulting `data`

利用:

NSOperationQueue *queue = [[NSOperationQueue alloc] init];
[NSURLConnection sendAsynchronousRequest:request queue:queue completionHandler:^(NSURLResponse *response, NSData *data, NSError *error) {

    // now process resulting `data`
}];

或者,您可以实现这些NSURLConnectionDataDelegate方法。有关这方面的更多信息,请参阅URL 加载系统编程指南的使用 NSURLConnection部分。


您说“如果请求为空”:我假设您的意思是“如果返回的数据为空”。你说它是[[]]。如果这真的是你得到的,它听起来像是一个包含一个项目的数组(它本身是一个空数组)。还是它[](这是一个空数组)?或者是nil吗?

我将假设返回的数据是[]一个空数组。

我还建议您考虑使用NSJSONSerialization内置的 JSON 解析器,但显然您可以根据JSONValue需要使用。

最后,您的实现正在跳过第一个条目(NSArray使用从零开始的索引)。我假设那是无意的。

NSOperationQueue *queue = [[NSOperationQueue alloc] init];
[NSURLConnection sendAsynchronousRequest:request queue:queue completionHandler:^(NSURLResponse *response, NSData *data, NSError *error) {

    if (error) {
        NSLog(@"%s: sendAsynchronousRequest error: %@", __FUNCTION__, error);
        return;
    }

    NSError *parseError;
    NSArray *meinErgebnis = [NSJSONSerialization JSONObjectWithData:data options:0 error:&parseError];

    if (parseError) {
        NSLog(@"%s: JSONObjectWithData error: %@", __FUNCTION__, parseError);
        return;
    }

    if ([meinErgebnis count] == 0) {
        NSLog(@"%s: meinErgebnis empty", __FUNCTION__);
        return;
    }

    for (NSDictionary *dictionary in meinErgebnis)
    {
        // now process each dictionary entry in meinErgebnis
    }

    // etc.
}];
于 2013-08-12T21:14:34.880 回答