当使用Cocoa/Cocoa-Touch和iPhone开发工具包时,一个典型的约定是构建一个与服务器端web服务器对话的客户端。我在编程时面临的一个常见问题是按顺序发出多个HTTP请求,有时多达5-6个请求。发出请求的顺序与返回请求的顺序不是线性的。当一个视图被带到为其触发这些请求的窗口时,我会收到使用NSNotification的通知,让我知道何时有特定的数据可用。我正在考虑一种方法,它只在所有数据集都准备好时才会触发我的UI。寻找对你的方法的良好实践和洞察力。你在使用互斥锁还是类似的东西?简单的计数器?
发布于 2009-02-13 16:38:45
假设您知道需要发出的所有请求,您可以将各种请求对象存储在一个数组(NSMutableArray)中。当您收到每个请求的通知时,将其从数组中取出。当数组长度等于零时,您知道所有请求都已完成。您需要确保对数组的访问是由互斥锁保护的。您还需要确保仅在填充数组之后才触发请求(以免在将第二个请求插入数组之前收到通知)。
另一种技术是在另一个线程(performSelectorInBackground:或performSelector:onThread:)中发出HTTP请求,但它们是同步进行的。这样,您就可以确切地知道所有请求都已完成的时间,并可以对UI执行signal操作以更新自身。
发布于 2009-02-13 17:26:49
您需要在NSHTTPRequest旁边存储一些状态,以便将请求链接到UI (或模型)对象,或者,您必须能够从请求返回的内容中推断出这一点。
codelogic的建议都是这种模式的例子。NSOperation将是另一个。
发布于 2010-01-19 16:38:59
正如codelogic所说,维护独立的数组或字典相当容易。
例如,确保正确初始化字典:
notifications = [[NSMutableDictionary alloc] initWithObjectsAndKeys:
@"foo", @"bar",
@"baz", @"bla",
nil];然后您可以注册通知(也在初始化器中):
for (NSString *key in notifications)
{
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(entityDidFetch:) name:key object:self];
}entityDidFetch:方法可能如下所示:
- (void)entityDidFetch:(NSNotification *)notification
{
@synchronized(notifications)
{
NSString *name = [notification name];
[notifications removeObjectForKey:name];
if ([notifications count] == 0)
{
// Final connection…
}
}
}如果您使用notifications或不使用GC,请不要忘记发布iPhone字典。
https://stackoverflow.com/questions/546537
复制相似问题