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

在这种情况下,发言人说,如果我们不在[unowned self]那里使用,那将是内存泄漏.这是否意味着我们应该始终使用[unowned self]内部封闭?
在Swift Weather应用程序的ViewController.swift的第64行,我不使用[unowned self].但我通过使用一些@IBOutlet像self.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) 我有一个相当常见的用例,但我找不到一个简单的方法来处理AFNetworking:
每当服务器返回任何请求的特定状态代码时,我想:
我认为这可以通过一些全局完成/错误处理程序来完成AFHTTPClient,但我没有找到任何有用的东西.那么,做"我想要的"的"正确"方式是什么?enqueueHTTPRequestOperation:在我的AFHTTPClient子类中重写,复制操作并用一个执行我想要的块(重新验证,排队复制操作)包装原始完成处理程序?或者我完全走错了路?
谢谢!
编辑:删除了对401状态代码的引用,因为当我使用令牌身份验证时,这可能是为HTTP basic保留的.
我使用RequestRetrierAlamofire 4.0控制重试过期访问令牌的请求.我在这里关注文档.
我有一个非常类似于文档OAuth2Handler中可用的示例实现RequestAdapter和RequestRetrier.
我遇到的问题func should(_ manager: SessionManager, retry request: Request, with error: Error, completion: @escaping RequestRetryCompletion)是永远不会被召唤.然而adapt,RequestAdapter实现的方法确实被调用了.
调试,我看到SessionDelegate只有should(_,retry,with,completion)在出现错误时调用,但返回与授权问题相关的状态代码的请求似乎不会产生错误,因此永远不会调用该方法.
我在这里错过了什么吗?
我正在尝试构建一个管理我的项目的网络调用的类.到目前为止,我的意思是在全球范围内处理错误,一切都很好.我创造了两个功能; 用于发布请求postRequest(:_)和获取请求getRequests(:_).Datamaker用于返回URL,参数,标题等数据,dataparser函数用于解析响应数据,最后用于解决调用错误的函数errorHandler().
当我调用请求函数时,我给出一个参数来帮助它应该发出的请求函数.在函数中,它首先调用数据制作者获取数据,然后发出请求Alamofire,最后如果请求成功则调用dataparser和onSuccess(data:)闭包,或者如果它不是调用errorHandler(statusCode:)和onFailure(message:)关闭.
我将一个开关块放入errorHandler并为其参数提供了statusCode.在case 401我打电话,Token().refresh()并在它完成称为errorHanlder完成.在postRequest/ errorHandler的完成块中,我postRequest使用相同的参数再次调用.它没用.我不知道为什么,它每次都进入无限循环并连续提出请求.
所以我决定尝试cnoon的AuthorizationManager课程(可以在这个链接中找到; 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)