我对iOS编程还比较陌生。这是一个困扰我很长时间的问题。
因此,在其中一个视图控制器中,在将该视图控制器推入导航项之前,我要在前一个视图控制器的prepareForSegue
中将一个参数(称为userId)传递给它。当此视图控制器基于上一个视图控制器的userId
加载(初始化)时,我正在进行网络调用以获取与此用户相关的信息列表,然后将该信息填充到当前模型中视图控制器。
我应该把数据准备的逻辑放在哪里?
最佳答案
对于情节提要板,使用viewDidLoad:
应该很好,因为情节提要板不会重用视图控制器。无论如何,为了确保视图控制器使用场景的完整性,我倾向于使用以下模式:
开始在viewWillAppear:
中异步加载远程数据
停止在viewWillDisappear:
中加载远程数据
这样可以确保您的数据将始终更新为当前的userId
,因为ID可能会在viewDidLoad
之后更改,例如如果视图控制器重用或在设置.view
之前访问userId
属性。
您还应该跟踪数据是否已加载。例如,您可以创建一个名为_isDataLoaded
的私有布尔字段,在完成加载数据时将其设置为true
,在取消加载数据或设置新的false
时将其设置为userId
。
概括起来,我的想法中的模式应该是这样的:
@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;
}
这取决于您使用什么框架从远程服务器检索数据,但是模式应该是这样的。这将确保:
仅在显示视图时才加载数据。
消失后,View Controller将不会加载更多数据。
如果
userId
相同,则不会再次下载数据。支持视图控制器重用。
关于ios - 我应该在哪里准备数据?在awakeFromNib,viewDidLoad或其他内容中,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/20735103/