我正在尝试集中我的应用的网络代码。基本上,在需要来自服务器的信息的任何地方中,我创建了一个对象serverRequest来获取我的类ServerRequest来获取信息。 ServerRequest完成后,需要将信息发送回调用对象。当然它应该异步工作 - 我不希望我的应用程序在等待时停止运行。
这种信息的返回是棘手的部分。我的选择似乎是授权和通知。据我所知,他们都有自己的问题:
DELEGATION: 我将自己作为委托传递给serverRequest对象。问题是,如果在请求完成之前取消分配,serverRequest将发送一个解除分配的对象,我的程序将崩溃。为了防止这种情况,我必须跟踪我的所有服务器请求(可能有多个)并让我们知道我的dealloc方法,以便我不再收到任何消息。所有这一切都是可能的,但看起来确实很痛苦。
通知: 似乎有很多工作要传递信息。我必须将自己添加为通知中心的观察员,然后在我解除分配时删除自己。此外,我必须将完成后发布的通知类型的信息传递给ServerRequest。而且我的ServerRequest必须将收到的数据推送到NSDictionary中,然后我将其传递回来。
这两种方法都应该有效,但它们似乎都是为了让ServerRequest唤醒调用代码并将其传递给对象而付出的努力。我认为通知更灵活,更少痛苦,并且不太可能导致崩溃,但我对这两种方法都不满意。对于任何反馈,我们都表示感谢。感谢。
答案 0 :(得分:1)
我会选择列表方法。只需要一个包含NSMutableArray的requestController来跟踪所有请求。这样做的好处是,当您的控制器被取消分配时,您可以执行类似[requests makeObjectsPerformSelector:@selector(cancelRequest)]的操作来阻止所有这些请求占用网络。它还有助于调试,因为您实际上可以向每个对象询问其待处理的请求,评估许多待处理请求的性能影响等。当请求完成时,可以通知请求控制器并可以通过简单的方式将其从列表中删除的removeObject。
此外,某人必须拥有您的对象。在手动管理的内存中,ObjC对象可以保留自己,但如果你想转移到GC,拥有一个数组比CFRetaining自由浮动对象更清晰。
答案 1 :(得分:0)
您可以保留传入的委托,然后在服务器请求完成之前不会取消分配。
e.g。
@interface ServerRequest : NSObject
{
id delegate;
}
@property (retain) id delegate;
@end
@implementation ServerRequest
@synthesize delegate;
@end
但是,您需要避免从另一端释放ServerRequest,或者您可以让ServerRequest的发起者在它自身发布时释放它并且可以解决问题。要做到这一点
@interface SomeObject : NSObject
{
ServerRequest getsomedata;
}
@property (retain) ServerRequest getsomedata;
@end
- (void)f()
{
[self setGetsomedata:[[ServerRequest alloc] init]];
[[self getsomedata] release]; // take away the refcount from allocating, setting the property will retain
}
答案 2 :(得分:0)
答案 3 :(得分:0)
我在过去遇到过类似的问题,但选择的设计略有不同(类似于@uliwitness所建议的。
我选择将请求(即实际内容)与传递系统分开。在您的情况下,这意味着serverRequest保存请求的内容(URL,数据等),但不与服务器进行实际通信。服务器请求的委托将是一个单独的CommLayer类,它实际上将负责发送请求,接收它并通知代理请求完成。
因此,要发送serverRequest,您可以调用类似[CommLayer sendRequest:serverRequest withDelegate:myDelegate]的内容。
现在CommLayer是持有委托而不是serverRequest的实际类,你总是可以使用像[CommLayer removeDelegate:myDelegate]
之类的东西通知CommLayer你的类不再有效了。当然这是更多的工作,但你真的从这个设计中获得了很多好处,仅举几例: