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



来自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 
    }
}

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

编辑:有关更多说明:请参阅如何从阿拉莫菲尔返回值

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

我认为您误解了在这种情况下"仅在响应处理程序范围内可用"的含义。没有任何机制阻止您将值传递或复制到响应块中。

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

最新更新