当我在异步回调中设置对象时会发生什么?

时间:2016-01-21 19:54:58

标签: swift nsurlsession alamofire

来自Alamofire页面,

  

不是阻止执行以等待来自服务器的响应,而是指定回调一旦收到响应就处理响应。请求的结果仅在响应处理程序的范围内可用。根据响应或从服务器接收的数据执行的任何执行都必须在处理程序中完成。

我理解但是当你尝试设置变量时会发生什么?

例如:

class Person: NSObject {}
var person = Person()

Alamofire
    .request(APIRouter.GetUpComingRides(parameters))
    .responseJSON { response in
        // Doesn't do anything
        self.instanceVariable = response.result.value 
    }
}

使用unsafeAddressOf,我知道response.result.value实际上在内存中有一个地址。那么,当你将变量设置为时会发生什么?

如果我使用值类型而不是引用类型,它将起作用。

struct Person {}
var person: Person

Alamofire
    .request(APIRouter.GetUpComingRides(parameters))
    .responseJSON { response in
        // Actually sets the result to the value
        self.result = response.result.value 
    }
}

阅读Alamofire所调用的NSURLSession文档dataTaskWithRequest,对delegate队列进行操作。必须有一些东西禁止将我的实例变量对象的指针设置为委托队列中的对象。

编辑:有关更多说明:请参阅How to return value from Alamofire

如果你使用值类型(结构,字符串,整数等等),你实际上不必使用完成处理程序模式。

1 个答案:

答案 0 :(得分:1)

我认为你误解了什么"只有在响应处理程序范围内可用"意味着在这种情况下。没有任何机制阻止您将值传递或复制出响应块。

Alamofire试图解释它没有为此请求的响应值提供同步接口,因此您必须使用异步处理程序来触发您对响应的使用。您可以自由地将响应值复制出响应处理程序,但是在响应处理程序将来执行某个时间之前,不会设置您设置的变量。 上述问题中的Doesn't do anything评论可能就是一个例子。并不是没有设置变量,而是在完成处理程序执行之前检查该变量的值而不是某些其他代码分支,并且发现它仍然是nil