Ios 我应该创建并使用singleton与每个视图共享数据,还是只通过代理传递数据?

Ios 我应该创建并使用singleton与每个视图共享数据,还是只通过代理传递数据?,ios,objective-c,delegates,singleton,Ios,Objective C,Delegates,Singleton,我的应用程序有5个部分从HomeViewController启动,它是navigationController的根目录。现在,每个部分都将5-10个视图推送到导航堆栈中,这些视图在运行时进行网络连接,返回时,视图会弹出,但出于性能目的,我将数据传递回HomeViewController,因此我不需要重复网络请求 尽管如此,我有两个问题: 我是否需要创建一个带有全局共享实例的singleton类,确保init过程只发生一次?我的HomeVC不是在做这项工作吗,因为我会一直打开它,因此保持prope

我的应用程序有5个部分从
HomeViewController
启动,它是
navigationController
的根目录。现在,每个部分都将5-10个视图推送到导航堆栈中,这些视图在运行时进行网络连接,返回时,视图会弹出,但出于性能目的,我将数据传递回
HomeViewController
,因此我不需要重复网络请求

尽管如此,我有两个问题:

  • 我是否需要创建一个带有全局共享实例的
    singleton
    类,确保
    init
    过程只发生一次?我的
    HomeVC
    不是在做这项工作吗,因为我会一直打开它,因此保持
    properties
    处于活动状态

  • 我应该允许类获取
    单例
    属性并进行更改吗?或者我应该通过代理传递数据

  • 学员示例:

    // HomeView.m
    -(void)pushAnotherView
    {
        view2.property = self.property;
    }
    
    View2.m
    -(void)backButtonPressed
    {
        // Pass property back to Home
    }
    
    例2:

    // Home.h
    @property (nonAtomic, strong) NSString *propertyStr;
    
    // View2.h
    @property (nonatomic, strong) HomeViewController *homeVC;
    
    // Home.m
    -(void)pushAnotherView 
    { 
        view2.home = self; 
    }
    
    // View2.m
    
    -(void)someMethod
    {
        self.homeVC.propertyStr = @"Make changes here";
    }
    

    您需要从视图控制器结构中删除数据模型和与数据相关的关注点。您的模型可以是任何内容,从核心数据到具有一系列属性的单例类。模型的唯一访问应该是通过模型控制器(可能是单例的)。模型控制器将有单独的方法,用于通过块驱动回调请求应用程序所需的所有数据

    当视图控制器的视图需要数据时,它会联系模型控制器并请求数据。模型控制器将检查模型,以查看请求的数据是否可用。如果是,模型控制器将立即使用请求的数据调用完成块。如果没有,它将从网络API检索请求的数据。成功下载和解析数据后,将其存储到模型中供将来使用,然后使用数据调用完成块

    使用此模式,视图控制器不需要知道如何检索数据,也不需要管理其状态,所有这些逻辑都转移到模型控制器

    完成块示例:

    typedef void (^ListDataCompletionBlock)(BOOL success, NSArray *listData);
    
    然后模型控制器将具有如下方法:

    - (void)requestListDataWithCompletion:(ListDataCompletionBlock)completion;
    
    来自视图控制器的调用如下所示:

    [[MyModelController sharedInstance] requestListDataWithCompletion:^(BOOL success, NSArray *listData) {
        if (success) {
            // Use the listData.
        } else {
            // Recover from being unable to retrieve the requested data.
        }
    };
    

    不建议让
    HomeVC
    来做这项工作-它是一个“视图控制器”,本质上应该只控制该视图。如果你想把它当作一个单例,为什么不创建一个实际的单例,这样功能就可以被分离到最有意义的地方呢?谢谢,既然我们正在讨论这个问题,你能检查一下我的其他问题吗?这是同样的事情,只是想找出最好的设计模式,我只是不想把问题混为一谈,让它变得更复杂。好吧,谢谢,这是有道理的。但问题是,我使用parse.com作为我的应用程序的后端,它们有一些实用的功能,比如
    PFQueryTableViewController
    ,可以在
    视图中连接到服务器并填充它。它还负责缓存数据。这对我很有用。但是,例如,在这个视图上,我有方法以我想要的方式组织数据并填充视图,但我也需要其他视图上的组织数据,但不一定要显示相同的结果、表。这就是为什么我考虑将数据存储在单例中,但不真正在其上发出服务器请求。你觉得怎么样?啊。。。在这种情况下,单例数据存储对象可能是最直接的解决方案。我不主张将委托作为在应用程序中传递数据的一种手段,除了一些简单的东西,比如用户选择。。。它们很难遵循,如果您忘记实现委托方法,然后调用它,可能会导致应用程序崩溃。