2014-03-01 35 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