Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/37.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone 使用AppDelegate共享数据_Iphone_Objective C_Ios_Model View Controller_Delegates - Fatal编程技术网

Iphone 使用AppDelegate共享数据

Iphone 使用AppDelegate共享数据,iphone,objective-c,ios,model-view-controller,delegates,Iphone,Objective C,Ios,Model View Controller,Delegates,我找到了一些资料,解释了如何使用AppDelegate在iOS应用程序中的对象之间共享数据。我已经很轻松地实现了它,在我的情况下,它看起来是一个很好的方法。考虑到使用AppDelegate可以做些什么,我想知道应该在哪里划定界限 显然,还有其他的方法来实现、使用和管理何时使用AppDelegate共享数据合适?在我目前的情况下,我使用这种方法存储用于推送通知的appleDeviceToken。我在用户登录或注销应用程序时使用该令牌 在MyAppDelegate.h中,我声明属性: @prope

我找到了一些资料,解释了如何使用AppDelegate在iOS应用程序中的对象之间共享数据。我已经很轻松地实现了它,在我的情况下,它看起来是一个很好的方法。考虑到使用AppDelegate可以做些什么,我想知道应该在哪里划定界限

显然,还有其他的方法来实现、使用和管理何时使用AppDelegate共享数据合适?在我目前的情况下,我使用这种方法存储用于推送通知的appleDeviceToken。我在用户登录或注销应用程序时使用该令牌


在MyAppDelegate.h中,我声明属性:

@property (nonatomic, retain) NSString *appleDeviceToken;
在MyAppDelegate.m中,我合成appleDeviceToken,然后设置它:

@synthesize appleDeviceToken;    

------------------------------------------------------

- (void)application:(UIApplication*)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData*)deviceToken
{
  NSString *devToken = [[[[deviceToken description]
                          stringByReplacingOccurrencesOfString:@"<"withString:@""]
                         stringByReplacingOccurrencesOfString:@">" withString:@""]
                        stringByReplacingOccurrencesOfString: @" " withString: @""];
  appleDeviceToken = devToken;
}


到目前为止,这很有效,但这是理想的方法吗?我还应该知道什么?

这似乎是一个合适的用法。应用程序委托很容易被滥用,因为它是一个易于访问的对象,已经存在于每个应用程序中。不过,它有一个真正的目的,正如其标题所示,就是为应用程序对象做出决策,就像表视图委托为其表视图对象所做的那样

在本例中,您正在存储从应用程序本身传递给代理的信息。我想这就是底线所在


存储此令牌似乎符合应用程序代理的目的,除非您有另一个控制器对象,该对象专注于处理远程通知。在这种情况下,您可能只需将令牌直接传递给该控制器。

当数据和对象是真正全局的和/或无法在图形中进一步向下推时。通常不需要如此高的存储量。同样,您的实现通常应该对应用程序委托知之甚少甚至一无所知——有什么比单例更糟糕呢?单例神:)如果应用程序委托很复杂,那么就出了问题。如果应用程序代理的界面对您的许多实现可见(通过
#import
),或者他们直接发送消息,那么一定是出了问题

不需要(惯用的ObjC)单例——只有一个app委托实例

NSUserDefaults用于持久化小值(顾名思义)——共享功能是一个副作用


因为在本例中,数据已经由UIKit发送到应用程序委托中,所以这可能是存储数据的好地方,或者是应用程序的对象表示形式。您也可以考虑将这些消息转发给适当的处理程序。重要的一点——在大多数情况下,您希望初始化沿着对象图向下流动,并从可能的最低点开始流动(例如,与许多对象引用回应用程序委托不同)。因此,您可能会看到应用程序委托设置了顶级视图控制器的模型,但视图控制器随后可以设置它所推送的视图控制器的模型。通过这种方式,您将减少依赖关系和控制流,因果关系将更容易跟踪,并且您将能够更轻松地测试它——不受大规模全局状态的影响。

我更务实。由于我的应用程序中的appDelegate知道tabBarController是如何填充的,以及所有导航控制器,因此我有几个方法可以让任意类与其他类进行通信-通常这些是某个类的单个实例(但不是单例)。这就是说,如果您想要放在那里的内容没有令人信服的理由放在appDelegate中,那么,它可能不属于那里

下一行总是表示你做错了什么:

MyAppDelegate *appDelegate = (MyAppDelegate*) [UIApplication sharedApplication].delegate;
应用程序委托是
ui应用程序的委托。这是有原因的。它不被称为
ApplicationDataStore
,甚至也不被称为
ApplicationCoordinator
。事实上,您要求应用程序提供其
委托
,然后将其视为
id
之外的其他内容,这意味着您要求应用程序执行一些它没有执行的任务。它的任务是管理应用程序所需的一切(这并不意味着“应用程序”所需的一切)


您似乎已经构建了一个存储此信息的位置:
RKObjectManager
。我会让应用程序代理将令牌传递到那里,让登录视图控制器注意到是时候推送它了。我甚至不会将字符串
@/api/users/%I/appleDeviceToken放入其中“
在视图控制器中。这与显示视图无关。这是一个适合您的网络堆栈(您似乎已经在
RKObjectManager
中找到了它)。“ViewController”是指“用于帮助显示视图的控制器”而不是“视图所代表的操作的处理器”。

RKObjectManager是RestKit用于进行RESTful http调用的接口(或者您已经知道了吗?)。我没听说过用它来共享数据,但我会调查一下。我没意识到这一点。让RestKit保持此状态可能不正确。您可能希望自己的中心模型对象管理“网络连接”(包括作为RK的前端)
MyAppDelegate *appDelegate = (MyAppDelegate*) [UIApplication sharedApplication].delegate;