【问题标题】:Setting timeout on a delegate method in objective c在目标 c 中的委托方法上设置超时
【发布时间】:2011-08-02 22:18:14
【问题描述】:

如果服务器调用耗时超过 10 秒,我需要设置一个 NSTimer 对象来手动超时(Restkit 不支持)

这是我下面的代码。本质上,我的加载器类将使用 loadObjectsAtResourcePath 委托请求

如果需要超过 10 秒,我想调用 Restkit 在服务器遇到错误时调用的相同失败方法 (didFailWithError)

但我觉得我做错了,而且失败方法需要一个只在委托类中初始化的对象。

//CLASS FOR LOADING OBJECTS

-(void)getObjects{
    RKObjectManager *sharedManager = [RKObjectManager sharedManager];

    // loads the object via delegate
    [sharedManager loadObjectsAtResourcePath:self.resourcePath delegate:self];

    //creates an error
    NSError *error = [NSError errorWithDomain:@"world" code:200 userInfo:nil];

    // Setting timeout here. goto failure 
    nTimer = [NSTimer scheduledTimerWithTimeInterval:10.0f target:self.delegate selector:@selector:(objectLoader:nil didFailWithError:error:) userInfo:nil repeats:NO];
}


// handles failure
- (void)objectLoader:(RKObjectLoader*)objectLoader didFailWithError:(NSError*)error {
..
}

// handles success
- (void)objectLoader:(RKObjectLoader*)objectLoader didLoadObjects:(NSArray*)objects {
..
}

这样做的正确方法是什么?

【问题讨论】:

    标签: iphone objective-c nsurlconnection nstimer restkit


    【解决方案1】:

    在委托回调以外的方法中处理超时会更好。正如您所说,委托方法需要在类中创建的对象。而且您可能不想以完全相同的方式处理“真正的错误”和超时,对吧?例如,如果超时,您可能希望选择重试。

    如果您确实希望超时和错误失败来做完全相同的事情,您仍然可以为此使用另一种方法:

    -(void)getObjects{
        RKObjectManager *sharedManager = [RKObjectManager sharedManager];
    
        // loads the object via delegate
        [sharedManager loadObjectsAtResourcePath:self.resourcePath delegate:self];
    
        //creates an error
        NSError *error = [NSError errorWithDomain:@"world" code:200 userInfo:nil];
    
        // Setting timeout here. goto failure 
        nTimer = [NSTimer scheduledTimerWithTimeInterval:10.0f target:self selector:@selector(didTimeout) userInfo:nil repeats:NO];
    }
    
    
    - (void)didTimeout {
        NSLog(@"Error");
    }
    
    // handles failure
    - (void)objectLoader:(RKObjectLoader*)objectLoader didFailWithError:(NSError*)error {
        [self didTimeout];
    }
    
    // handles success
    - (void)objectLoader:(RKObjectLoader*)objectLoader didLoadObjects:(NSArray*)objects {
        //don't forget to invalidate the time or else you'll get errors even when successful
        [nTimer invalidate];
    }
    

    如有必要,您当然可以将其扩展为更灵活,但这似乎涵盖了您所要求的内容。

    【讨论】:

      【解决方案2】:

      不熟悉RestKit,但我首先想到的是,将调度选择器设置为调用验证方法而不是失败方法要好得多,让验证方法检查是否有有效响应在定义的时间内收到,如果没有,则取消请求等并调用失败。

      虽然我不熟悉 RestKit,但我熟悉使用 NSURLRequests,并且我知道可以在发出请求以生成超时失败时定义超时 - 不知道这是否有帮助...

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-10-21
        • 1970-01-01
        • 2015-02-26
        相关资源
        最近更新 更多