2014-03-31 29 views
1

我正在製作的應用程序使用UITableViewController,並使用來自Web服務器的數據填充該表格視圖。使UITableViewController單元格在導航時不會消失

在我的viewDidLoad我有一個方法,從所述網絡服務器加載數據,將其作爲自定義對象存儲在數組中,然後將其加載到單元格中。這工作正常。

問題:

但是,每次我瀏覽從UITableViewController離開,然後回來,這再次加載一切時間。這是非常不必要的,所以我所做的就是在NSUserDefaults中存儲一個boolean,該文件會跟蹤這是否是第一次啓動應用程序。如果是(您剛剛登錄),請從服務器加載數據。如果沒有,不要。

但是,正如我注意到的,tableView重新設置每次我離開(或回到)Controller。此外,我存儲自定義對象的所有數組現在都是空的,所以我無法從數組中加載它。 (我每次導航回TableViewController,它是空的)

我試圖存儲在NSUserDefaults陣列,然後只需填充tableView與該數據每一次,但事實證明,我不能自定義存儲對象在NSUserDefaults

我想實現的是:

每當我導航離開並回說:TableViewController(我用的是SWRevealViewController),我不希望tableView空出來。我希望所有單元格都保持不變,這樣在加載view和填充tableview之間沒有等待時間。

如果這是不可能的,我想要第二好的。將數組存儲在應用程序的某個位置,然後在用戶導航回到TableViewController時立即將該數據重新加載到tableview中。這比我的首選解決方案慢,但比從我的服務器加載所有內容更快,更少的數據消耗。

任何幫助表示讚賞!

謝謝。

+0

您可以將您的'UITableViewController'設置爲單例實例,或者只創建一次並保存指針。然後你需要你的控制器只用指針創建一個。但是,當我得到你只是想從服務器緩存數據? 有很多方法可以做到這一點。 'NSUrlCache','NSUserDefaults','CoreData','plist'。 –

+0

以下是我的/想要的: 1.當有人啓動應用程序時,他們必須登錄。當他們這樣做時,我想從「服務器」加載數據並填充「tableview」。 2.當有人拉下tableview時,我想讓它重新加載來自服務器的數據。 這工作正常。但是: 3.當某個人離開視圖,然後返回時,我希望'tableView'持久。我不想重新加載所有數據。 這可能嗎? – Aleksander

+0

而不是你的viewDidLoad,嘗試在viewDidAppear中進行,因爲在添加視圖時調用該視圖,並且在視圖顯示之前它將準備好,模擬數據爲「持續」 – user2277872

回答

1

您應該創建一個單獨的對象來管理從Web服務獲取數據,然後將其存儲在本地。此對象可以在應用程序委託中創建,也可以在適當的位置創建並傳遞給表視圖控制器。數據對象應該提供一個數組,視圖控制器可以使用該數組來填充表。您甚至可以讓該數據對象在應用程序打開時立即從Web服務中啓動,而不必等待顯示錶視圖控制器。

我不建議在內存中保留視圖,只是爲了節省加載表視圖(使用本地存儲的數據)所需的最少時間。除非你正在談論成千上萬的條目,否則在加載視圖時你不會注意到延遲時間。如果您正在談論成千上萬的條目,我建議您一次將幾百條數據加載到表格中。

就存儲數據而言,最簡單的方法可能就是將Web請求的原始響應寫入文件。更優雅的解決方案可能包括創建一些對象來表示數據並使用NSKeyedArchiver。保持本地數據存儲是一個巨大的主題,有無數的選項,所以我建議您自己做一些Google搜索以找到最適合您的解決方案。你可能會開始在這些地方:

如果使用的NSKeyedArchiver選項去,你可以生成通過執行以下的文件路徑:

+ (NSString *)dataFilePath 
{ 
    NSURL *directory = [[NSFileManager defaultManager] 
     URLForDirectory:NSLibraryDirectory 
     inDomain:NSUserDomainMask 
     appropriateForURL:nil 
     create:YES 
     error:nil 
    ]; 
    NSURL *fullURL = [cachesDirectory URLByAppendingPathComponent:@"a_file_name"]; 
    return [fullURL relativePath]; 
} 
+0

謝謝!我遵循編碼/解碼指南,然後將其存儲在NSUserDefaults中。 – Aleksander

+0

很高興幫助。但是,NSUserDefaults實際上僅用於存儲首選項,而不是實際數據。最好將數據寫入文件:'[NSKeyedArchiver archiveRootObject:rootObject toFile:pathToFile]' – drewag

+0

噢,好的。感謝那。我會立即做出改變! – Aleksander

0

當用戶從服務器調用數據時,您需要在第一次將所有數據存儲在緩存中。在那之後,每當用戶導航並回到緩存中的頁面加載數據時。

+0

如何在iOS中緩存數據? – Aleksander

+0

有這麼多的例子。嘗試谷歌自己。這裏是參考:http://stackoverflow.com/questions/19326284/what-is-the-proper-way-to-use-nscache-with-dispatch-async-in-a-reusable-table-ce – Chomu

+0

嘗試使用此代碼示例: - in .h Class: - @property(nonatomic,strong)NSCache * imageCache;在.m類的viewDidload函數中初始化這個。 self.imageCache = [[NSCache alloc] init];最後在UITableViewCell函數中使用這個。 NewsItem * item = [newsItemsArray objectAtIndex:indexPath.row]; cell.newsTitle.text = item.title; UIImage * cachedImage = [self.imageCache objectForKey:item.image] ;;;;;;;;;;;;;;;;;;;;;;;;;;;,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, (cachedImage) cell.imageView.image = cachedImage; } return cell; – Chomu