gpt4 book ai didi

ios - 如何防止异步方法表单被调用两次?

转载 作者:行者123 更新时间:2023-11-28 21:57:15 24 4
gpt4 key购买 nike

我有一个应用程序每 .01 秒跟踪一次一些数据。当数据 (NSArray) 计数达到 50 项时,我想将其异步发送到服务器。问题是,当调用从服务器返回时,我将有另外 20 个或更多的地 block 。但另一个问题是,当它达到 50 时被调用的方法调用将在它的 51、52、53 等时被调用......

现在我能做的是刷新原始数组,以便在我发送原始 50 个时,接下来的 20 个进入它,但我的问题是,如果数据点很快到达,我在第一次调用之前又得到 50 个服务器返回?

我的问题是处理此问题的最佳方法是什么?也许某种异步调用工厂?所以每次我达到 50 时,我都会刷新数组并将 50 点发送到某个异步工厂,该工厂创建一个知道如何发送自己的数据的异步对象?

1-50 > 发送到工厂,该工厂创建负责发送到服务器的委托(delegate)对象。2-50 发送到创建负责发送到服务器的委托(delegate)对象的工厂。等等……

这会起作用,但如果在委托(delegate)中出现问题怎么办。如何协调未能到达服务器的点?是否有用于此类问题的设计模式?

最佳答案

我认为你的问题不是阻止异步方法被调用两次。它正在安排您的任务。您在刷新 50 个对象方面走在正确的轨道上。问题是 NSArray 不是线程安全对象,多个并发方法共享同一个 NSArray 对象是不安全的。对于记录数据的方法,它应该有自己的本地缓冲区。一旦本地缓冲区达到 50,它就会向委托(delegate)回调发送一个包含 50 个对象的新数组(不是副本),此时,记录方法可以安全地清除其缓冲区。

对于您的 Sender 类,它应该有一个 pendingQueue 数组,它是您等待发送到服务器的数据的集合,您可以轻松地处理此类中的错误。确保在 pendingQueue 中添加对象或删除对象时进行序列化以避免线程问题。

所以像这样的东西应该可以工作。 (您将需要一个主要方法来设置这些对象和委托(delegate)。此外,该示例省略了初始化。)

@protocol RecorderDelegate

- (void)recorderDidReachDataPoint:(NSArray *)data;

@end

@interface Recorder()

@property (nonatomic, weak) id delegate

- (void)recordTaskWithProgressHandler
{
NSMutableArray *buffer = [NSMutableArray array];
while ( ...pause for 0.01 second or whatever )
{
// record your task using buffer
// ...
if (buffer.count == 50)
{
if ([self.delegate respondsToSelecter:@selector(recorderDidReachDataPoint:)])
{
[self.delegate recorderDidReachDataPoint:[NSArray arrayWithArray:buffer]];
}
[buffer removeAllObjects];
}
}
}
@end


@interface Sender ()<RecorderDelegate>

@property (nonatomic, strong) NSMutableArray *pendingQueue;

- (void)sendToServer
{
// Do your async method.
// once the data is successfully uploaded remove the object from pendingQueue
// if failed, you can either retry or append them to the end of pendingQueue to try later
}

// delegate
- (void)recorderDidReachDataPoint:(NSArray *)data
{
[self.pendingQueue addObjectsFromArray:data];
[self sendToServer];
}

关于ios - 如何防止异步方法表单被调用两次?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26126715/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com