如何提高ios应用程序的速度?

时间:2014-03-01 16:52:56

标签: mysql ios objective-c uitableview grand-central-dispatch

我的应用程序是在Objective-C for ios 7中开发的,它(通过插入NSString中的查询)将自身连接到执行服务器上数据库查询的php脚本。我有一些单元格(在tableView中),每个单元格都包含用户的信息(ID,名称,描述,个人资料图片)。每次加载TableView时,我都会运行3个查询来检索所有元素(以及从服务器检索每个用户的个人资料图片的方法),即:

NSString *IDUsers = @"Select ID from user";
NSString *Names = @"Select name from user";
NSString *Descriptions = @"Select Description from user";

对于每个字符串(IDUser,Names,Descriptions),我这样做:

//query can be IDUser or Names or Descriptions
NSMutableString *strURL = [NSMutableString stringWithFormat:@"http://localhost/myApp/selectquery.php?query=%@",query];

[strURL setString:[strURL stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]];

NSData *dataURL = [NSData dataWithContentsOfURL:[NSURL URLWithString:strURL]];

NSError* error;

NSDictionary* json = [NSJSONSerialization
                      JSONObjectWithData:dataURL
                      options:kNilOptions
                      error:&error];

NSMutableArray *results = [[NSMutableArray alloc] init];

int numRow = 0;

for (NSArray *arrow in json) {
    [results addObjectsFromArray:arrow];
    numRow++;
}

//results is the array of results of the query

当我通过脚本在db上执行查询时,它会给我返回数组(每个ID一个数组,每个名称一个数组,每个描述一个数组)。然后我为ID数组中的每个ID执行for循环,然后检索与每个ID(来自服务器)关联的配置文件图片。

NSMutableString *strURL = [NSMutableString stringWithFormat:@"http://localhost/myApp/getProfilePicture.php?IDUser=%@",arrID[i]];

    [strURL setString:[strURL stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]];

    NSData *dataURL = [NSData dataWithContentsOfURL:[NSURL URLWithString:strURL]];

    UIImage *profileSnap = [UIImage imageWithData:dataURL];

然后这些数组填充每个单元格(每个用户的单元格)。 这在本地(与MAMP)发生的确非常快。但是,如果连接字符串连接到服务器时发生这种情况,那就太慢了。我能怎么做?你有建议吗?我读到我可以用Grand Central Dispatch做,但是怎么做?

2 个答案:

答案 0 :(得分:2)

如果速度慢是由于网络延迟和网络请求的固有特性,Grand Central Dispatch根本没有帮助。

您可以在他的回答中按照 emotality 建议的正确示例,执行一些延迟加载,特别是对于图像。 GCD允许您在后台执行任务以改善用户体验,但它不会加速Web请求。

如果你的应用很慢,因为它正在处理大量数据,那么你可以遵循其他策略。例如,如果您的应用处理100,000条记录,您可以修改您的Web服务以查询数据的子集,这样您就可以立即向用户显示第一个n记录,同时您仍然可以在后台下载更多记录。

我希望这会以某种方式帮助您,但您需要提供有关您的应用程序为何缓慢的更多详细信息,并且由于每种原因都有不同的策略。

编辑:
正如我所说,你是Web服务需要支持它,如果不是你需要改变它并设计一些方法。 在途中会在您的请求的查询字符串中传递其他参数(例如,这些参数将为rangeStartrangeEnd。您的 php 脚本需要识别这些参数,并在数据库中查询与该特定范围相对应的记录。

显然这会使你的设计变得复杂,因为你需要跟踪你已经查询过的范围,但我认为这也不困难。

答案 1 :(得分:1)

这称为延迟加载,它在后台运行(下载),而tableView正在加载来自委托等的所有其他数据:)

dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0ul);
dispatch_async(queue, ^{

// get image from server here

        dispatch_sync(dispatch_get_main_queue(), ^{

            // set images after they have been downloaded/saved.
            // ALWAYS USE MAIN_QUEUE WHEN WORKING WITH VISIBLE ELEMENTS LIKE THESE

            [cell.imageView setImage:(UIImage *)];
            [cell setNeedsLayout];
        });

});

[self.tableView reloadData];

请记住在完成后重新加载tableview数据。 希望这有帮助!

要获得最快的网络服务电话,请使用MKNetworkKit