Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/26.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/8/.htaccess/6.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
Objective c 集中我的目标C应用程序';s网络代码_Objective C_Networking_Notifications_Delegation - Fatal编程技术网

Objective c 集中我的目标C应用程序';s网络代码

Objective c 集中我的目标C应用程序';s网络代码,objective-c,networking,notifications,delegation,Objective C,Networking,Notifications,Delegation,我正试图集中我的应用程序的网络代码。基本上,在任何需要从服务器获取信息的地方,我都会创建一个类serverRequest的对象serverRequest来获取信息。ServerRequest完成后,需要将信息发送回调用对象。当然,它应该异步工作——我不希望我的应用程序在等待时陷入停顿 信息的返回是一个棘手的部分。看来我的选择是授权和通知。据我所知,他们都有自己的问题: 代表团: 我将自己伪装成serverRequest对象的委托。问题是,如果我在请求完成之前解除分配,serverRequest将

我正试图集中我的应用程序的网络代码。基本上,在任何需要从服务器获取信息的地方,我都会创建一个类serverRequest的对象serverRequest来获取信息。ServerRequest完成后,需要将信息发送回调用对象。当然,它应该异步工作——我不希望我的应用程序在等待时陷入停顿

信息的返回是一个棘手的部分。看来我的选择是授权和通知。据我所知,他们都有自己的问题:

代表团: 我将自己伪装成serverRequest对象的委托。问题是,如果我在请求完成之前解除分配,serverRequest将传递一个解除分配的对象,我的程序将崩溃。为了防止出现这种情况,我必须跟踪所有服务器请求(可能不止一个),并在dealloc方法中让它们都知道,这样我就不会再收到任何消息。所有这一切都是可能的,但这看起来确实很痛苦

通知: 传递信息似乎需要做很多工作。我必须将自己作为观察员添加到通知中心,然后在取消分配时删除自己。此外,我必须将完成后要发布的通知类型的信息传递到ServerRequest。我ServerRequest必须将接收到的数据推送到NSDictionary中,然后在传递数据后将其取出


这两种方法都应该可以工作,但只要让ServerRequest唤醒调用代码并向其传递一个对象,这两种方法似乎都需要付出巨大的努力。我认为通知更灵活,痛苦更小,导致崩溃的可能性更小,但我对这两种方法都不太满意。如有任何反馈,将不胜感激。谢谢。

您可以保留传入的代理,并且在服务器请求完成之前不会取消分配

e、 g

但是,您需要避免从另一端释放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
}

您可以保留传入的委托,然后在服务器请求完成之前不会取消分配

e、 g

但是,您需要避免从另一端释放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
}

你不应该保留你的代表。请参见

您不应保留您的代表。请参见

我将采用列表方法。只要有一个requestController,它包含一个NSMutableArray,可以跟踪所有请求。这样做的好处是,当您的控制器被解除分配时,您可以执行类似于[requests makeObjectsPerformSelector:@selector(cancelRequest)]的操作来阻止所有这些请求占用网络。它还有助于调试,因为您实际上可以询问每个对象它有哪些挂起的请求,评估许多挂起的请求对性能的影响等。当请求完成时,可以通知请求控制器,并可以使用简单的removeObject将其从列表中删除


此外,必须有人拥有您的对象。在手动管理的内存中,ObjC对象可以保留它们自己,但是如果您想转移到GC,使用数组比保留自由浮动对象更干净。

我会选择列表方法。只要有一个requestController,它包含一个NSMutableArray,可以跟踪所有请求。这样做的好处是,当您的控制器被解除分配时,您可以执行类似于[requests makeObjectsPerformSelector:@selector(cancelRequest)]的操作来阻止所有这些请求占用网络。它还有助于调试,因为您实际上可以询问每个对象它有哪些挂起的请求,评估许多挂起的请求对性能的影响等。当请求完成时,可以通知请求控制器,并可以使用简单的removeObject将其从列表中删除


此外,必须有人拥有您的对象。在手动管理的内存中,ObjC对象可以保留它们自己,但是如果您想转移到GC,使用数组比保留自由浮动对象更干净。

我过去遇到过类似的问题,但选择了稍微不同的设计(类似于@uliwitness建议的)

我选择将请求(即实际内容)与传递系统分开。在您的情况下,这意味着serverRequest包含请求的内容(URL、数据等)但不与服务器进行实际通信。服务器请求的委托将是一个单例CommLayer类,它实际上负责发送请求、接收请求并通知委托请求完成

因此,要发送serverRequest,您需要调用类似于[CommLayer sendRequest:serverRequest withDelegate:myDelegate]的命令

现在CommLayer是实际的类,它保存委托而不是serverRequest,您可以随时使用类似于[CommLayer removeDelegate:myDelegate]的内容通知CommLayer您的类不再有效

当然,这需要更多的工作,但您确实可以从这种设计中获得很多好处,举几个例子:

  • 真正的网络流量管理。您可以决定一次需要多少打开的连接,并对请求进行排队
  • 您可以取消不需要的请求

我过去遇到过类似的问题,但选择了稍微不同的设计(类似于@uliwitness的建议)

我选择将请求(即实际内容)与交付系统分开。在您的情况下,这意味着serverRequest保留请求的内容(URL、数据等),但不进行实际的通信