【问题标题】:Retry Objective-C method until a condition is met重试 Objective-C 方法,直到满足条件
【发布时间】:2016-03-02 11:50:20
【问题描述】:

我有一个被调用的方法,它做的第一件事就是确定网络何时可达。如果不是,我想等待 10 秒,然后使用最初传入的参数/参数运行相同的方法..

这是我的灾难性尝试(我更多的是 JS 开发人员,对 Objective-C 来说相对较新):

- (void)sendRequestToURL:(NSString *)url withPostData:(NSString *)postData withPage:(int)page sortBy:(NSString *)sort completionBlock:(void (^)(NSDictionary *))completion {

    if(![FooNetworkManager isReachable]){
        self.lastRequest = ??? // lastRequest is an NSDictionary
        dispatch_time_t delay = dispatch_time(DISPATCH_TIME_NOW, NSEC_PER_SEC * 10);
        dispatch_after(delay, dispatch_get_main_queue(), ^(void){
            [self sendRequestToURL:self.lastRequest]; // this is almost definitely wrong
        });
    }

}

在 JavaScript 中,我们可以在一个方法中访问 arguments 对象,该对象包含传递给该方法的所有参数,但不确定如何在 Objective-C 中复制它。

另外,self.lastRequest 在同一个类中进一步定义:

@property(nonatomic, strong) NSDictionary *lastRequest;

【问题讨论】:

    标签: objective-c


    【解决方案1】:

    在最简单的形式中,您可以省去lastRequest 并执行以下操作:

    - (void)sendRequestToURL:(NSString *)url withPostData:(NSString *)postData withPage:(int)page sortBy:(NSString *)sort completionBlock:(void (^)(NSDictionary *))completion {
    
        if(![FooNetworkManager isReachable]){
            dispatch_time_t delay = dispatch_time(DISPATCH_TIME_NOW, NSEC_PER_SEC * 10);
            dispatch_after(delay, dispatch_get_main_queue(), ^(void){
                [self sendRequestToURL:url withPostData:postData withPage:page sortBy:sort completionBlock:completion];
            });
        }
    }
    

    通过这种方式,您只是在块中捕获传递的参数。因此,您需要注意捕获可变对象(如果有的话)是可以接受的......

    您还应该有一些方法来取消重试,或者可能是最大尝试次数,甚至是尝试之间的指数回退时间。

    【讨论】:

    • 不知道为什么我不这样做!?谢谢。
    • 我的答案是错误的,这是正确的。对不起@benhowdle89!
    猜你喜欢
    • 2019-11-10
    • 1970-01-01
    • 1970-01-01
    • 2017-07-22
    • 1970-01-01
    • 2015-07-28
    • 1970-01-01
    • 2013-12-28
    • 1970-01-01
    相关资源
    最近更新 更多