我对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/

10-12 00:15
查看更多