gpt4 book ai didi

ios - 如何在 block 内分配变量?

转载 作者:行者123 更新时间:2023-11-28 22:22:54 26 4
gpt4 key购买 nike

从其他问题来看,似乎我所要做的就是在我的变量前面添加 __block,但是,它似乎对我不起作用。

在 block 内时,使用 NSLog() 检查时 token 已正确分配。如果我在返回 token 之前再次检查它;它变为 NULL。

- (NSString *)extractTokenFromURL:(NSURL *)tokenURL
{
__block NSString *token = nil;

NSURLSession *session = [NSURLSession sessionWithConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration]
delegate:self
delegateQueue:nil];
[[session dataTaskWithURL:self.tokenURL
completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
if (!error) {
NSHTTPURLResponse *httpResp = (NSHTTPURLResponse*) response;
if (httpResp.statusCode == 200) {
NSString *content = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
NSRange divRange = [content rangeOfString:@"<div id='token' style='display:none;'>" options:NSCaseInsensitiveSearch];
if (divRange.location != NSNotFound) {
NSRange endDivRange;
endDivRange.location = divRange.length + divRange.location;
endDivRange.length = [content length] - endDivRange.location;
endDivRange = [content rangeOfString:@"</div>" options:NSCaseInsensitiveSearch range:endDivRange];

if (endDivRange.location != NSNotFound) {
divRange.location += divRange.length;
divRange.length = endDivRange.location - divRange.location;

dispatch_async(dispatch_get_main_queue(), ^{
token = [content substringWithRange:divRange];
});
}
}
}
}
}] resume];

return token;
}

最佳答案

那是因为任务是异步运行的,所以该方法甚至会在 token 分配之前返回。

您应该做的是将一个完成 block 传递给此方法,并在您获得 token 后调用它。这样,您就不会在执行请求时阻塞主线程。

这就是你如何做到这一点:

- (void)extractTokenFromURL:(NSURL *)tokenURL completion:(void (^)(NSString *token, NSError* error))completion {
NSURLSession *session = [NSURLSession sessionWithConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration] delegate:self delegateQueue:nil];
[[session dataTaskWithURL:self.tokenURL
completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
if (!error) {
NSHTTPURLResponse *httpResp = (NSHTTPURLResponse*) response;
if (httpResp.statusCode == 200) {
NSString *token = // ...;
if (token) { // we have a valid token
if (completion) {
dispatch_async(dispatch_get_main_queue(), ^{
completion(token, nil);
});
}
} else if (completion) {
// create an error indicating why the token is not valid
NSError *error = // ...;
dispatch_async(dispatch_get_main_queue(), ^{
completion(nil, error);
});
}
}
} else if (completion) {
// send the http error. you could also wrap it on your own error domain and code
dispatch_async(dispatch_get_main_queue(), ^{
completion(nil, error);
});
}
}] resume];
}

您还可以有两个不同的 block :一个用于成功,另一个用于失败。

关于ios - 如何在 block 内分配变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19835431/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com