2014-03-01 33 views
1

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

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

对于每个字符串(ID用户,名称,说明)我做到这一点:

//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 

当我执行查询的数据库throught脚本,它给我返回数组(一个数组每个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做,但是怎么做?

+1

请问您可以添加整个代码吗?在此之后查询你在应用程序级别做了什么? –

+0

如果由于网络延迟和网络请求的固有特性而导致速度较慢,Grand Central Dispatch根本没有任何帮助。 – Merlevede

+1

看到编辑....... – Pinturikkio

回答

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中的数据在后台运行(下载)。 希望这有助于!

对于最快的Web服务调用,使用MKNetworkKit

2

如果速度慢是因为网络延迟和Web请求的固有性质,大中央调度没有帮助的。

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

如果您的应用速度很慢,因为它正在处理大量数据,您还可以使用其他策略。例如,如果您的应用处理100,000条记录,则可以修改您的Web服务以查询数据的一个子集,以便您可以立即向用户呈现第一条记录,而您仍然在后台下载更多记录。

我希望这能以某种方式帮助你,但是你需要提供更多关于你的应用程序为什么很慢的细节,并且由于各种原因,有一个不同的策略。

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

很明显,这会让你的设计复杂化,因为你需要跟踪你已经查询的范围,但是我不认为它也很难。

+1

这就是它!在我的tableview中加载了数千条记录,我该如何一次加载10个(例如)? – Pinturikkio

+0

查看编辑答案 – Merlevede