使用viewDidLoad:
應該罰款共同故事板使用,因爲故事板不會重用視圖控制器。不管怎樣,對於我的視圖控制器使用方案的完整性,我傾向於使用這種模式:
- 開始在
viewWillAppear:
- 停止異步加載遠程數據
viewWillDisappear:
加載遠程數據這確保您的數據將始終更新爲當前的userId
,因爲ID可能會在viewDidLoad
後更改,例如在視圖控制器重用或在設置userId
之前訪問.view
屬性。
您還應該跟蹤您的數據是否已加載。例如,您可以創建一個名爲_isDataLoaded
的私有布爾字段,在完成加載數據時將其設置爲true
,並在取消加載數據或設置新的userId
時將其設置爲false
。
概括起來,在我的想法的模式應該是這樣的:
@interface UserViewControler : UIViewController {
bool _isDataLoaded;
NSURLConnection _dataConnection;
}
@implementation UserViewController
-(void) setUserId:(int)userId {
if (_userId != userId) {
_userId = userId;
_isDataLoaded = false;
}
}
-(void) viewWillAppear:(BOOL)animated {
if (!_isDataLoaded) {
_dataConnection = // init data connection here
_dataConnection.delegate = self;
[_dataConnection start];
}
}
-(void) viewWillDisappear:(BOOL)animated {
if (_dataConnection) {
[_dataConnection cancel];
_dataConnection = nil;
_isDataLoaded = false;
}
}
// NSURLConnection call this when finish
- (void)connectionDidFinishLoading:(NSURLConnection *)connection {
_isDataLoaded = true;
_dataConnection = nil;
}
// NSURLConnection call this when fail to load data
- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error {
_isDataLoaded = false;
_dataConnection = nil;
}
這取決於你用什麼框架來從遠程服務器上的數據,但該模式應該是這樣的。這將確保:
- 只有當視圖出現時纔會加載數據。
- 視圖控制器在消失後不會載入更多數據。
- 如果是相同的
userId
,則不會再次下載數據。
- 支持視圖控制器重用。
來源
2013-12-23 02:43:08
tia
我的意思是你們所有的人都給了我一個很好的解決方案。 非常感謝大家。 – TypingPanda