AFNetworking: Handle error globally and repeat request

前端 未结 6 1656
温柔的废话
温柔的废话 2020-12-07 11:07

I have a use case that should be rather common but I can\'t find an easy way to handle it with AFNetworking:

Whenever the server returns a specific status code for <

6条回答
  •  慢半拍i
    慢半拍i (楼主)
    2020-12-07 12:02

    Here is the Swift implementation of user @adamup 's answer

    class SessionManager:AFHTTPSessionManager{
    static let sharedInstance = SessionManager()
    override func dataTaskWithRequest(request: NSURLRequest!, completionHandler: ((NSURLResponse!, AnyObject!, NSError!) -> Void)!) -> NSURLSessionDataTask! {
    
        var authFailBlock : (response:NSURLResponse!, responseObject:AnyObject!, error:NSError!) -> Void = {(response:NSURLResponse!, responseObject:AnyObject!, error:NSError!) -> Void in
    
            var httpResponse = response as! NSHTTPURLResponse
    
            if httpResponse.statusCode == 401 {
                //println("auth failed")
    
                dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_LOW, 0), { () -> Void in
    
                    self.refreshToken(){ token -> Void in
                        if let tkn = token{
                            var mutableRequest = request.mutableCopy() as! NSMutableURLRequest
                            mutableRequest.setValue(tkn, forHTTPHeaderField: "Authorization")
                            var newRequest = mutableRequest.copy() as! NSURLRequest
                            var originalTask = super.dataTaskWithRequest(newRequest, completionHandler: completionHandler)
                            originalTask.resume()
                        }else{
                            completionHandler(response,responseObject,error)
                        }
    
                    }
                })
            }
            else{
                //println("no auth error")
                completionHandler(response,responseObject,error)
            }
        }
        var task = super.dataTaskWithRequest(request, completionHandler:authFailBlock )
    
        return task
    }}
    

    where refreshToken (...) is an extension method I wrote to get a new token from the server.

提交回复
热议问题