使用RestKit和Swift全局处理401响应

时间:2015-03-05 12:40:41

标签: ios swift restkit

我目前正在开发使用Swift开发的iOS应用程序。对于REST调用,我使用的是RestKit框架。

我的项目的下一个阶段是开始对服务使用身份验证。我遇到的一个问题是处理来自服务的401(未经过身份验证)响应。在所有这些情况下,我想显示一个登录页面。我想避免多次实现错误处理。

我按照http://blog.higgsboson.tk/2013/09/03/global-request-management-with-restkit/上的教程进行了操作。但是,这是在Objective-C中,我想做的事情略有不同。

因此,我想构建一个扩展RKObjectRequestOperation的类,如教程中使用Swift。我收到错误时遇到了问题

  

使用selector' setCompletionBlockWithSuccess覆盖方法:失败:'具有不兼容的类型'((RKObjectRequestOperation,RKMappingResult) - > Void(RKObjectRequestOperation,NSError) - > Void) - >空隙'

我有点坚持这个,所以希望有人可以提供帮助。失败的方法的代码如下。

class CustomRequestOperation : RKObjectRequestOperation {
    func setCompletionBlockWithSuccess(success: (operation: RKObjectRequestOperation, mappingResult: RKMappingResult) -> Void, failure: (operation: RKObjectRequestOperation, error: NSError) -> Void) -> Void {

    }
}

有人能指出我的方法签名有什么问题吗?

2 个答案:

答案 0 :(得分:1)

您正在重写该方法,以便您可以让Xcode为您添加签名,如果您开始输入方法名称并远程转义。

应该是

func setCompletionBlockWithSuccess(success: (operation: RKObjectRequestOperation, mappingResult: RKMappingResult) -> Void, failure: (operation: RKObjectRequestOperation, error: NSError) -> Void) {

(您正在添加一个在超类方法中不存在的返回规范)

答案 1 :(得分:0)

这是swift中的全班......

class CustomRKObjectRequestOperation : RKObjectRequestOperation
{

    override func setCompletionBlockWithSuccess(success: ((RKObjectRequestOperation!, RKMappingResult!) -> Void)!, failure: ((RKObjectRequestOperation!, NSError!) -> Void)!) {


        super.setCompletionBlockWithSuccess({ (operation, RKMappingResult mappingResult) -> Void in

            if ((success) != nil) {
                success(operation, mappingResult);
            }

            }, failure: { (RKObjectRequestOperation operation, NSError error) -> Void in

                NSNotificationCenter.defaultCenter().postNotificationName("connectionFailure",object:operation)

                if ((failure) != nil) {
                    failure(operation, error);
                }

        })

    }
}

App Delegate

注册通知

NSNotificationCenter.defaultCenter().addObserver(self, selector:"connectionFailedWithOperation:",name:"connectionFailure", object:nil) 

func connectionFailedWithOperation(notification: NSNotification  ){


    let operation = notification.object as! RKObjectRequestOperation?;
    if ((operation) != nil) {

        let statusCode = operation!.HTTPRequestOperation.response.statusCode;

        if (statusCode == 401) {

            // log user out


        }
    }
}