The dataTaskWithRequest
methodology runs asynchronously, i.e., later. You possibly can’t simply reference the variables exterior of the block.
The everyday resolution is to offer a block parameter to your methodology that performs this request, a completion handler, and name the completion handler contained in the asynchronous block of dataTaskWithRequest
.
E.g., you might need:
- (void)performRequestWithURL:(NSURL *)url completion:(void (^ _Nonnull)(NSString *username, NSString *area, 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:knowledge 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 *area = [requestReply substringFromIndex:rangeDomain.location];
area = [domain stringByReplacingOccurrencesOfString:@"<SIP_domain>" withString:@""];
area = [domain stringByReplacingOccurrencesOfString:@"</SIP_domain>" withString:@""];
dispatch_async(dispatch_get_main_queue(), ^{
completion(username, area, nil);
});
}] resume];
}
And name it like so:
[self performRequestWithURL:url completion:^(NSString *username, NSString *domain, NSError *error) {
if (error) {
NSLog(@"error = %@", error);
return;
}
// use `username` and `domain` here ...
}];
// ... however not right here, as a result of the above runs asynchronously