我目前正在开发使用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 {
}
}
有人能指出我的方法签名有什么问题吗?
答案 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
}
}
}