重试Objective-C方法直到满足条件

时间:2016-03-02 11:50:20

标签: objective-c

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

这是我的灾难性尝试(我更像是一个JS dev,对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;

1 个答案:

答案 0 :(得分:4)

以最简单的形式,您可以免除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];
        });
    }
}
以这种方式,您只需捕获块中传递的参数。因此,您需要注意捕获可变对象(如果有的话)是可以接受的......

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