2012-07-13 34 views
2

我會盡量保持這個儘可能短..我正在做一個應用程序的iPhone需要能夠存儲從網絡上的一些圖像。圖像的URL(以及其他數據)存儲在MySQL服務器的一個表中。從那裏開始,我用JSON解析了表格,併成功將其序列化以顯示在應用程序的UITableView中。現在,每個單元格都顯示錶格中imageurl字段的圖像,以及表格中標題字段的圖像標題(從MySQL-> json.php-> NSArray(json)(objectAtIndex)等等。從網絡上的iPhone應用程序中存儲圖像和數據的最有效方法是什麼?

在這一點上,每次應用程序啓動時,它每次都從JSON.php中獲取來自url的所有信息,我認爲它每次都會下載圖像。我覺得這樣的工作比必要的工作要多,但是,由於數據庫會根據數據的獲取位置進行非正式更新,所以僅僅下載一次信息就不夠好。

問題1: 我需要一個應用程序「詢問」.php是否與JSON顯示的數據完全相同的解決方案。我能想到的最合乎邏輯的方式是在.php中添加一個「date」字段,顯示數據上次更新的日期,如果應用程序具有來自同一日期的數據,則不會發生任何反應,但如果php-副本日期比應用程序日期更新,那麼它必須能夠刪除所有存儲的數據,並用新的JSON數據替換。

問題2: JSON數據是iPhone中的NSArray,「Image」字段只是圖片的網址(www.example.com/image.png),而不是實際的圖片。我如何下載這些圖像並將它們保存在iPhone上,直到通過JSON獲得新的「版本」數據?

獎勵問題: 我現在使用的方法是在滾動時使UITableView滯後。我不是專業人士,但我已經閱讀了幾個地方,這可能是由於內存泄漏導致的,我還沒有完全明白這意味着什麼。我還讀到它可能是因爲我可能爲每個單元實例化對象,而不是一次並重新使用它。

底線: 我的目標是讓應用程序在第一次應用程序啓動時從json.php下載所有數據一次,並在稍後啓動時檢查版本是否正確。如果正確,那麼就不需要下載,只需使用存儲的包含JSON數據的對象,並從URL下載圖像文件即可下載首次啓動。如果不正確,請刪除所有先前存儲的圖像並清除json對象,然後導入新更新的json對象,並從iPhone上的某個位置的jsonobject中保存來自圖像url的圖像。

注意:更新數據(即添加一個額外的圖像,這是所做的所有更改)不是一個解決方案,在我眼中這不是一個可能性。當此數據庫中有更新時,我需要存儲在手機中的所有信息清除,然後重新下載所有信息。這是因爲我放入數據庫的信息是從另一個網站解析出來的,如果新圖像或數據更新包含某些其他字段的更改,那麼我寧願調整數據庫以適應(通過json.php)而不是一直髮布應用程序的更新。

這是錯誤的方法?這可能嗎?非常感謝幫助!

編輯從這裏和那裏 JSON-東西..

#define kURL [NSURL URLWithString:@"www.example.com"] 

NSData* data = [NSData dataWithContentsOfURL: kURL]; 
NSArray *json = [NSJSONSerialization JSONObjectWithData: data options: NSJSONReadingMutableContainers error: &e]; 
NSDictionary *info = [json objectAtIndex:indexPath.row]; 
cell.textLabel.text = [info objectForKey:@"Name"]; // ±Same for url 

這是從類中的不同地方提取的,所以他們可能不喜歡這個工作完全..

EDIT

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
static NSString *CellIdentifier = @"Cell"; 
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 
if (cell == nil) { 
    cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier]; 
} 



// Configure the cell... 

info = [json objectAtIndex:indexPath.row]; 

cell.textLabel.text = [info objectForKey:@"Name"]; 


NSString* imageURL = [info objectForKey:@"Image"]; 
NSURL *URLimage = [NSURL URLWithString:imageURL]; 
NSData* imageData = [NSData dataWithContentsOfURL:URLimage]; 
UIImage* images = [[UIImage alloc] initWithData:imageData]; 
cell.imageView.image = images; 




return cell; 

}

了Stian。

回答

0

我假設你通過NSURLRequest與你的服務器通信。如果是這樣,只要將緩存策略設置爲NSURLRequestReloadRevalidatingCacheData,並且它不會重新下載數據(如果它已經在緩存中並且是最新的)。這樣它幾乎可以爲你處理。

您還需要在應用程序委託的某處設置NSURLCache。

我不能告訴你如果你不發佈你的代碼,是什麼原因導致你的大塊滾動。

+0

嗯..嗯,這基本上是我有: 的#define KURL [NSURL URLWithString:@「WWW .example.com「] NSData * data = [NSData dataWithContentsOfURL: kURL];我們可以使用NSDictionary * info = [json objectAtIndex:indexPath.row];我們可以使用NSDictionary * cell.textLabel.text = [info objectForKey:@「Name」]; //±相同的網址 我應該改用別的東西嗎? – Sti 2012-07-13 17:34:51

+0

有點難以閱讀..我會更新帖子。 – Sti 2012-07-13 17:42:18

+0

你在哪裏創建單元格? – 2012-07-13 17:46:40

0

只是有人讀這個..當一個NSURL獲取(和解析)一個大的JSON文件,例如。您將希望在後臺執行此操作(dispatch_get_global_queue)。然後在需要數據時調用它(dispatch_async)。否則,你使用的是同一個線程的UI和在執行任務將凍結..

#define kBgQueue dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0) 
#define JSONURL [NSURL URLWithString:@"http://www.web.com/json.php"]  
... 

dispatch_async(kBgQueue, ^{ 
    NSData* data = [NSData dataWithContentsOfURL:JSONURL]; 
    [self performSelectorOnMainThread:@selector(fetchedData:) withObject:data waitUntilDone:YES]; 
}); 
+0

你是對的。我會再次使用GCD對fetchedData回調進行清理。我儘可能在performSelect上使用GCD,因爲它更容易閱讀,在不同的線程上執行不同的操作時更加明顯。 dispatch_async(kBgQueue,^ { 的NSData *數據= [NSData的dataWithContentsOfURL:JSONURL]; dispatch_sync(dispatch_get_main_queue(),^ { [自fetchedData:數據]; }); }); 編輯:對不起,多行代碼標籤似乎不工作的評論。 :/ – 2012-11-30 21:02:48

相關問題