2016-03-02 72 views
1

我有一个被调用的方法,它所做的第一件事是确定网络何时可到达。如果不是,我想等10s,然后用最初传入的参数/参数运行相同的方法。重试Objective-C方法,直到满足条件

这是我的灾难性尝试(我更像一个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中,一个方法里面,我们有机会获得包含被传入方法的所有PARAMS的arguments对象,不知道如何在Objective-C复制此。

此外,self.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]; 
     }); 
    } 
} 

@property(nonatomic, strong) NSDictionary *lastRequest; 

回答

4

最简单的形式,你可以用lastRequest免除做块中传递的参数。所以你需要小心捕获可变对象,如果你有任何,是可以接受的...

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

+0

不知道为什么我没有这样做!?谢谢。 – benhowdle89

+0

我的回答错了,这是正确的。对不起@ benhowdle89! – dokun1