以前它是这样的:
-Class1,Class2和Class3都是UIVIEwController的子类
-Helper类
– 内容显示类
他们做的事情差别很大,但共同的特点是他们与助手班级的互动.它们以多种不同的方式从用户收集请求的详细信息,然后最终向帮助程序类发送请求.
当它同步完成时,助手类将返回数据.然后,每个类将解释数据(XML文件)并通过segue将它们传递给Content显示类
所以大致如下:
1类:
//Get user inputSomeData *data = [helperclass makerequest];ID vcdata = [data process];[self performSegueWithIDentifIEr:@"segueIDentifIEr"];---- (voID)prepareForSegue:(UIStoryboardSegue *)segue{ DestinationVIEwController *destination = (DestinationVIEwController *)segue.destinationVIEwController; destination.data = vcdata;}
内容显示类:
- (voID)vIEwDIDLoad{ [super vIEwDIDLoad]; [self.data presentdata];}
现在看起来像这样
我通过首先使它与Class1一起使用来处理这个问题,以便将修复程序部署到class2和class3.所以class1和helper现在就像这样交互
1类:
//Get user inputSomeData *data = [helperclass makerequestWithSender:self];ID vcdata = [data process];[self performSegueWithIDentifIEr:@"segueIDentifIEr"];---- (voID)prepareForSegue:(UIStoryboardSegue *)segue{ DestinationVIEwController *destination = (DestinationVIEwController *)segue.destinationVIEwController; destination.data = vcdata;}
现在我面临的最大问题是如何将helperclass中的数据恢复到Class1.我设法让它工作
(voID)makeRequestWithSender:(Class1*)sender{ [NSURLConnection sendAsynchronousRequest:... { [sender sendData:data]; }}
但是,当我把它推到另外2个GUI类别时,这将构成我遇到困难的请求.我的第一个想法是设置sender:(ID)但是在[sender sendData:data]行失败告诉我ID没有方法sendData:或类似的.
希望我在这里不是太模糊,你们可以提供帮助.如果需要,我将能够发布代码片段但是现在任何人都可以帮助更好地建议如何构造此请求的代码?
解决方法 您基本上想要使用’观察者模式’或(可能)略微更改的设置,因此您可以使用委托.观察者模式
您可以通过NSNotificationCenter和NSNotifications获得机制.您的3个不同的UIVIEwController子类每个都订阅一个特定的NSNotification,您可以通过NSNotificationCenter发布通知来通知它们.
以下代码是如何在vIEwcontroller子类中处理问题的示例:
- (voID)vIEwWillAppear:(BOol)animated { [super vIEwWillAppear:animated]; // subscribe to a specific notification [[NSNotificationCenter defaultCenter] addobserver:self selector:@selector(doSomethingWithTheData:) name:@"MyDataChangednotification" object:nil];}- (voID)vIEwWilldisappear:(BOol)animated { [super vIEwWilldisappear:animated]; // do not forget to unsubscribe the observer,or you may experIEnce crashes towards a deallocated observer [[NSNotificationCenter defaultCenter] removeObserver:self];}...- (voID)doSomethingWithTheData:(NSNotification *)notification { // you grab your data our of the notifications userinfo MyDataObject *myChangedData = [[notification userInfo] objectForKey:@"myChangedDataKey"]; ...}
在您的助手类中,在数据更改后,您必须通知观察者,例如
-(voID)myDataDIDChangeHere { MyDataObject *myChangedData = ...; // you can add you data to the notification (to later access it in your vIEwcontrollers) [[NSNotificationCenter defaultCenter] postNotificationname:@"MyDataChangednotification" object:nil userInfo:@{@"myChangedDataKey" : myChangedData}];}
通过@protocol
假设所有UIVIEwController子类都驻留在父视图控制器中,您可以在助手类中实现协议,并使父视图控制器成为委托.然后,父视图控制器可以通过传递消息来通知子视图控制器.
您的帮助程序类声明可能如下所示(假设ARC):
@protocol HelperDelegate;@interface Helper : NSObject@property (nonatomic,weak) ID<HelperDelegate> delegate;...@end@protocol HelperDelegate <NSObject>-(voID)helper:(Helper *)helper dataDIDChange:(MyDataObject*)data;@end
在帮助程序实现中,您将通过以下方式通知代理:
...if ([self.delegate respondsToSelector:@selector(helper:dataDIDChange:)]) { [self.delegate helper:self dataDIDChange:myChangedDataObject];}...
您的父视图控制器需要是辅助类的委托并实现其协议;在宣言中粗略草图
@interface ParentVIEwController : UIVIEwController <HelperDelegate>
并在短版本中实施
// you alloc init your helper and assign the delegate to self,also of course implement the delegate method-(voID)helper:(Helper *)helper dataDIDChange:(MyDataObject*)data { [self.myCustomChildVIEwController doSomethingWithTheNewData:data];}
除了..
你可能会问自己喜欢哪种方法.两者都是可行的,主要的区别在于,通过观察者模式,您可以“立即”获得更多对象,而协议只能有一个代理,并且必须在必要时转发消息.关于利弊的讨论很多.一旦你下定决心,我建议你阅读它们(抱歉没有足够的声誉发布超过两个链接,所以请搜索stackoverflow).如果不清楚,请询问.
总结以上是内存溢出为你收集整理的iphone – 在类/异步请求/ iOS之间传递数据全部内容,希望文章能够帮你解决iphone – 在类/异步请求/ iOS之间传递数据所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)