[英]How can I improve the speed of my ios app?
我的應用程序是在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做,但是怎么做?
如果速度慢是由於網絡延遲和Web請求的固有特性,Grand Central Dispatch根本沒有幫助。
您可以按照他的答案中的情感性建議的正確示例來執行一些延遲加載,特別是對於圖像。 GCD允許您在后台執行任務以改善用戶體驗,但它不會加速Web請求。
如果您的應用程序因處理大量數據而變慢,則可以遵循其他策略。 例如,如果您的應用程序處理100,000條記錄,您可以修改您的Web服務以查詢數據的子集,這樣您就可以立即向用戶顯示前n
條記錄,同時您仍然可以在后台下載更多記錄。
我希望這會以某種方式幫助您,但您需要提供有關您的應用程序為何緩慢的更多詳細信息,並且由於每個原因,都有不同的策略。
編輯:
正如我所說,你是Web服務需要支持它,如果不是你需要改變它並設計一些方法。 在途中將傳遞請求的查詢字符串中的其他參數 (例如,這些參數將是rangeStart
和rangeEnd
)。 您的php腳本需要識別這些參數並在數據庫中查詢與該特定范圍相對應的記錄。
顯然這會使你的設計變得復雜,因為你需要跟蹤你已經查詢過的范圍,但我認為這也不困難。
這稱為延遲加載,它在后台運行(下載),而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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.