目标 C 方法不等待 Swift 方法的完成处理程序

Objective C method not waiting for Swift method's completion handler

提问人:jbeu425 提问时间:7/30/2020 更新时间:7/30/2020 访问量:155

问:

我正在从 Objective C 类调用 Swift 方法。它应该运行 Swift 代码,等待它完成,然后才继续到 Objective C 类中的下一行。现在它运行了几行 Swift 代码,然后在完成处理程序之后转到该行,然后再命中完成处理程序。当 Swift 代码完成运行时,它会按应有的方式命中完成处理程序,但是我如何阻止它事先跳到完成处理程序之前?

Swift 类 (TwitterRequest.swift)

@objc func startRequest(withUsername username: String, completion: @escaping (Bool) -> Void) {
        
        requestToken() { token in
            
            self.getUserTimeline(bearerToken: token, username: username) { timeline in
                // Get user twitter feed
                completion(true)
            }
        }
        
    }

从 Objective C 类调用上述方法

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
    if ([segue.identifier isEqualToString:@"showTwitterTimeline"]) {
    
        [[TwitterRequest new] startRequestWithUsername:_usernameTextField.text completion:^(BOOL completion) {

         // Completion handler for startRequest. 

        }];

         
         // Code is jumping here before above completion handler is hit. Why?
    }
}




func getUserTimeline(bearerToken: BearerToken, username: String, completion: (UserTimeline) -> Void) {

        var test = UserTimeline()
        
        completion(test)
}
iOS Objective-C Swift 闭包

评论

0赞 TylerP 7/30/2020
了解异步编程的含义:programmingios.net/what-asynchronous-means
0赞 jbeu425 7/30/2020
我现在明白 URLSession 请求是异步的。使用信号量来等待发出请求会不是一个坏主意吗?
1赞 TylerP 7/30/2020
是的,这将是一个坏主意,因为您将阻止主 (UI) 线程(因为这是在 中完成的)。如果希望在请求完成后发生某些事情,则必须将其放在完成处理程序块中。prepareForSegue

答:

1赞 testdrive 7/30/2020 #1

这是完成处理程序的预期行为。代码将继续执行,但当请求完成其作业时,将调用此请求的完成处理程序。