我的应用程序是在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做,但是怎么做?
答案 0 :(得分:2)
如果速度慢是由于网络延迟和网络请求的固有特性,Grand Central Dispatch根本没有帮助。
您可以在他的回答中按照 emotality 建议的正确示例,执行一些延迟加载,特别是对于图像。 GCD允许您在后台执行任务以改善用户体验,但它不会加速Web请求。
如果你的应用很慢,因为它正在处理大量数据,那么你可以遵循其他策略。例如,如果您的应用处理100,000条记录,您可以修改您的Web服务以查询数据的子集,这样您就可以立即向用户显示第一个n
记录,同时您仍然可以在后台下载更多记录。
我希望这会以某种方式帮助您,但您需要提供有关您的应用程序为何缓慢的更多详细信息,并且由于每种原因都有不同的策略。
编辑:
正如我所说,你是Web服务需要支持它,如果不是你需要改变它并设计一些方法。
在途中会在您的请求的查询字符串中传递其他参数(例如,这些参数将为rangeStart
和rangeEnd
。您的 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