我對 Objective C 和移動開發非常陌生。我想在此會話之外執行獲取并使用回應,誰能告訴我該怎么做?
現在我收到錯誤“使用未宣告的識別符號'用戶名'
NSMutableURLRequest *request = [[NSMutableURLRequest alloc] init];
[request setURL:[NSURL URLWithString:url]];
[request setHTTPMethod:@"GET"];NSURLSession *session = [NSURLSession sessionWithConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration]];
[[session dataTaskWithRequest:request completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
NSString *requestReply = [[NSString alloc] initWithData:data encoding:NSASCIIStringEncoding];
NSRange rangeUsername = [requestReply rangeOfString:@"<username>"];
NSString *username = [requestReply substringFromIndex:rangeUsername.location];
username = [username stringByReplacingOccurrencesOfString:@"<username>" withString:@""];
username = [username stringByReplacingOccurrencesOfString:@"</username>" withString:@""];
NSRange rangeDomain = [requestReply rangeOfString:@"<SIP_domain>"];
NSString *domain = [requestReply substringFromIndex:rangeDomain.location];
domain = [domain stringByReplacingOccurrencesOfString:@"<SIP_domain>" withString:@""];
domain = [domain stringByReplacingOccurrencesOfString:@"</SIP_domain>" withString:@""];
}] resume];
NSLog(@"Username: %@", username);
NSLog(@"Domain: %@", domain);
uj5u.com熱心網友回復:
該dataTaskWithRequest方法異步運行,即稍后運行。您不能只參考塊之外的變數。
典型的解決方案是為執行此請求的方法提供一個塊引數,一個完成處理程式,并在dataTaskWithRequest.
例如,您可能有:
- (void)performRequestWithURL:(NSURL *)url completion:(void (^ _Nonnull)(NSString *username, NSString *domain, NSError *error))completion {
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
NSURLSession *session = [NSURLSession sharedSession];
[[session dataTaskWithRequest:request completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
if (error) {
dispatch_async(dispatch_get_main_queue(), ^{
completion(nil, nil, error);
});
return;
}
NSString *requestReply = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
NSRange rangeUsername = [requestReply rangeOfString:@"<username>"];
NSString *username = [requestReply substringFromIndex:rangeUsername.location];
username = [username stringByReplacingOccurrencesOfString:@"<username>" withString:@""];
username = [username stringByReplacingOccurrencesOfString:@"</username>" withString:@""];
NSRange rangeDomain = [requestReply rangeOfString:@"<SIP_domain>"];
NSString *domain = [requestReply substringFromIndex:rangeDomain.location];
domain = [domain stringByReplacingOccurrencesOfString:@"<SIP_domain>" withString:@""];
domain = [domain stringByReplacingOccurrencesOfString:@"</SIP_domain>" withString:@""];
dispatch_async(dispatch_get_main_queue(), ^{
completion(username, domain, nil);
});
}] resume];
}
并這樣稱呼它:
[self performRequestWithURL:url completion:^(NSString *username, NSString *domain, NSError *error) {
if (error) {
NSLog(@"error = %@", error);
return;
}
// use `username` and `domain` here ...
}];
// ... but not here, because the above runs asynchronously
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/477644.html
