0

在我的 iPhone 应用程序中,我需要访问网络服务器才能登录我的系统。客户端要求数据库仅在服务器上。所以我在 ASP.NET 和 MySQL 数据库中创建了一个管理面板,其中存储了登录信息。

现在,当我在代码中使用下面给出的方法从服务器获取数据时,需要花费太多时间(即超过一分钟)来响应。

在我之前从服务器获取特定数据的情况下,当我下次尝试获取它时会快速获取该值。但是对于新数据,它又需要很多时间,或者更确切地说是超时。

有时请求甚至超时。

我应该怎么做才能减少延迟并加快整个登录过程?

有一个更好的方法吗?

有关以下代码的信息:

firstname.text 是我的用户名。

lastname.text 是我的密码。

label.text 是我用来存储从服务器获取的密码的临时标签。

allUsers 是存储从服务器获得的响应的数组。

我也使用 JSON 来解析网络服务器和 iPhone 之间的数据。

我使用 plist 来存储我的网址。Plist名称是url.plist

代码如下:

    SBJSON *json = [SBJSON new];
    json.humanReadable = YES;
    NSString *service = @"/getUserInfo";
    //NSString *requestString = [NSString stringWithFormat:@"{\"method\":\"%@\"}",  service];
    NSString *requestString = [NSString stringWithFormat:@"{\"firstname\":\"%@\"}",firstName.text,nil];
    NSLog(@"Request String: %@", requestString);

    NSData *requestData = [NSData dataWithBytes: [requestString UTF8String] length: [requestString length]];

    NSString *fileLoc = [[NSBundle mainBundle] pathForResource:@"url" ofType:@"plist" ];
    NSDictionary *fileContents = [[NSDictionary alloc] initWithContentsOfFile:fileLoc];
    NSString *urlLoc = [fileContents objectForKey:@"baseURL"];
    urlLoc = [urlLoc stringByAppendingString:service];
    NSLog(@"URL is %@",urlLoc);
    NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL: 
                                    [NSURL URLWithString: urlLoc]];  

    NSString *postLength = [NSString stringWithFormat:@"%d", [requestData length]];
    [request setHTTPMethod: @"POST"];
    [request setValue:postLength forHTTPHeaderField:@"Content-Length"];
    [request setValue:@"application/json" forHTTPHeaderField:@"Content-Type"];
    [request setHTTPBody: requestData];

    //Data returned by WebService
    NSError *respError = nil; 
    NSData *returnData = [NSURLConnection sendSynchronousRequest: request returningResponse: nil error: &respError ];

    if (respError) {
        NSString *msg = [NSString stringWithFormat:@"Connection failed! Error - %@ %@",
                         [respError localizedDescription],
                         [[respError userInfo] objectForKey:NSURLErrorFailingURLStringErrorKey]];   

        UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"Check your network connection" 
                                                            message:msg delegate:self cancelButtonTitle:@"OK" 
                                                  otherButtonTitles:nil];
        [alertView show];


        NSArray *keys = [NSArray arrayWithObjects:@"firstname", @"lastname", nil];
        NSArray *objects = [NSArray arrayWithObjects:@"failed to", @"refresh data...", nil];
        NSDictionary *dictionary = [NSDictionary dictionaryWithObjects:objects forKeys:keys];

        allUsers = [[NSArray alloc] initWithObjects:dictionary, nil];
        //[self setUserData:allUsers];
        //[tblView reloadData];

        //[allUsers release];

    } 
    else
    {

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

        NSDictionary *results = [responseString JSONValue];
        // Additional steps as the webservice is adding an additional "{d:" so stripping of that
        NSString *extractUsers = [results objectForKey:@"d"];

        // The actual string that Web services returned, so re-scan the same and convert it as object
        NSDictionary *finalResult = [extractUsers JSONValue];
        allUsers = [finalResult objectForKey:@"users"];
        NSLog(@"Data is : %@",allUsers);
        NSLog(@"Final Value is : %@",[[allUsers objectAtIndex:0] valueForKey:@"lastname"]);
        if([allUsers count]>0)
        {
            label.text = [[allUsers objectAtIndex:0] valueForKey:@"lastname"];
        }
        else 
        {
            label.text = @"";
        }
        [responseString release];
        [request release];

    }




    [inProgressIndicator stopAnimating];
    [fileContents release];

    //Release all the allocated data
    [json release];

}
4

1 回答 1

1

首先,您应该检查发生在哪一侧的延迟 - 是服务器的延迟(可能是未优化的数据库使用等)、互联网连接问题还是其他问题。只需跟踪并检查,首先在那一分钟执行了哪一行代码。

于 2011-01-12T10:22:47.040 回答