相关疑难解决方法(0)

我们总是在Swift中使用[unowned self]内部封闭

在WWDC 2014会议403 中级Swift成绩单中,有以下幻灯片

在此输入图像描述

在这种情况下,发言人说,如果我们不在[unowned self]那里使用,那将是内存泄漏.这是否意味着我们应该始终使用[unowned self]内部封闭?

Swift Weather应用程序的ViewController.swift的第64行,我不使用[unowned self].但我通过使用一些@IBOutletself.temperature和更新UI self.loadingIndicator.它可能没问题,因为@IBOutlet我所定义的都是weak.但为了安全起见,我们应该一直使用[unowned self]吗?

class TempNotifier {
  var onChange: (Int) -> Void = {_ in }
  var currentTemp = 72
  init() {
    onChange = { [unowned self] temp in
      self.currentTemp = temp
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

ios automatic-ref-counting swift

455
推荐指数
7
解决办法
14万
查看次数

AFNetworking:全局处理错误并重复请求

我有一个相当常见的用例,但我找不到一个简单的方法来处理AFNetworking:

每当服务器返回任何请求的特定状态代码时,我想:

  • 删除缓存的身份验证令牌
  • 重新认证(这是一个单独的请求)
  • 重复失败的请求.

我认为这可以通过一些全局完成/错误处理程序来完成AFHTTPClient,但我没有找到任何有用的东西.那么,做"我想要的"的"正确"方式是什么?enqueueHTTPRequestOperation:在我的AFHTTPClient子类中重写,复制操作并用一个执行我想要的块(重新验证,排队复制操作)包装原始完成处理程序?或者我完全走错了路?

谢谢!

编辑:删除了对401状态代码的引用,因为当我使用令牌身份验证时,这可能是为HTTP basic保留的.

networking ios afnetworking

37
推荐指数
2
解决办法
2万
查看次数

Alamofire 4.0 RequestRetrier应该(_,retry,with,completion)不被调用

我使用RequestRetrierAlamofire 4.0控制重试过期访问令牌的请求.我在这里关注文档.

我有一个非常类似于文档OAuth2Handler中可用的示例实现RequestAdapterRequestRetrier.

我遇到的问题func should(_ manager: SessionManager, retry request: Request, with error: Error, completion: @escaping RequestRetryCompletion)是永远不会被召唤.然而adapt,RequestAdapter实现的方法确实被调用了.

调试,我看到SessionDelegate只有should(_,retry,with,completion)在出现错误时调用,但返回与授权问题相关的状态代码的请求似乎不会产生错误,因此永远不会调用该方法.

我在这里错过了什么吗?

ios swift alamofire

13
推荐指数
2
解决办法
7378
查看次数

Alamofire:如何在全球范围内处理401?

我正在尝试构建一个管理我的项目的网络调用的类.到目前为止,我的意思是在全球范围内处理错误,一切都很好.我创造了两个功能; 用于发布请求postRequest(:_)和获取请求getRequests(:_).Datamaker用于返回URL,参数,标题等数据,dataparser函数用于解析响应数据,最后用于解决调用错误的函数errorHandler().

当我调用请求函数时,我给出一个参数来帮助它应该发出的请求函数.在函数中,它首先调用数据制作者获取数据,然后发出请求Alamofire,最后如果请求成功则调用dataparser和onSuccess(data:)闭包,或者如果它不是调用errorHandler(statusCode:)onFailure(message:)关闭.

我将一个开关块放入errorHandler并为其参数提供了statusCode.在case 401我打电话,Token().refresh()并在它完成称为errorHanlder完成.在postRequest/ errorHandler的完成块中,我postRequest使用相同的参数再次调用.它没用.我不知道为什么,它每次都进入无限循环并连续提出请求.

所以我决定尝试cnoonAuthorizationManager课程(可以在这个链接中找到; Alamofire:如何在全球范围内处理错误).我稍微改了一下(添加了一个新的参数作为标题并改变了NetworkSuccessHandler类型NSData).这是新表格:

public class AuthorizationManager: Manager {
    public typealias NetworkSuccessHandler = (NSData?) -> Void
    public typealias NetworkFailureHandler = (NSHTTPURLResponse?, AnyObject?, NSError) -> Void

    private typealias CachedTask = (NSHTTPURLResponse?, AnyObject?, NSError?) -> Void

    private var cachedTasks = Array<CachedTask>()
    private …
Run Code Online (Sandbox Code Playgroud)

networking ios swift alamofire

8
推荐指数
1
解决办法
2202
查看次数