Метод с именем не возвращен
У меня есть этот класс, который выполняет вызов REST.
- (NSString*)cerca:(NSString*)email{
if ([[Utility sharedUtility] connected]) {
HttpClient *self = [HttpClient sharedHTTPClient];
[self.requestSerializer setValue:[self getUserAgent] forHTTPHeaderField:@"User-Agent"];
[self.requestSerializer setValue:NST_CODE forHTTPHeaderField:@"Nst-Code"];
[self.requestSerializer setValue:[[NSUserDefaults standardUserDefaults] objectForKey:@"nst_id"] forHTTPHeaderField:@"Nst-Id"];
[self.requestSerializer setValue:[[NSUserDefaults standardUserDefaults] objectForKey:@"api_key"] forHTTPHeaderField:@"Api-Key"];
NSMutableDictionary *parameters = [NSMutableDictionary dictionary];
parameters[@"email"] = email;
__block NSString *result;
[self POST:@"get_info" parameters:parameters
success:^(NSURLSessionDataTask *task, id responseObject) {
result = responseObject;
} failure:^(NSURLSessionDataTask *task, NSError *error) {
}];
return result;
}
Вызов возвращает JSON . Моя проблема в том, что когда я возвращаю результат; Ничего не передается вызывающему методу. Ты можешь сказать мне, почему??
Метод вызова
HttpClient *client = [HttpClient alloc];
NSString *result = [client cerca:email];
3 ответа
Этот метод, который вы вызываете, является асинхронным, то есть результат приходит после того, как вы вернулись. Вам нужно изменить свой метод так, чтобы он принимал аргумент блока и возвращал результат в обратном вызове.
- (void)cerca:(NSString*)email callback:(void (^)(id result)) callback {
if ([[Utility sharedUtility] connected]) {
...
[self POST:@"get_info" parameters:parameters
success:^(NSURLSessionDataTask *task, id responseObject) {
if (callback) {
callback(responseObject)
}
} failure:^(NSURLSessionDataTask *task, NSError *error) {
}];
}
}
Чтобы вызвать метод, вы должны сделать:
[client cerca:email completion:^(NSString *response) {
// Do what you want with the response.
}];
Я изменил свой метод
- (NSString*)cerca:(NSString*)email completion:(void (^)(NSString *res))completion {
Но я не понимаю, как это назвать. Показания
[client cerca:email completion:nil];
Это потому что self POST
вызов асинхронный, и вы возвращаете result
прежде чем он успел быть назначен. Вы должны восстановить свой - (NSString*)cerca:(NSString*)email
метод, так что он как-то может справиться с асинхронностью этого. Обычно проще всего изменить метод, чтобы он занимал блок завершения, как в параметре. Может быть что-то вроде:
- (void)cerca:(NSString *)email completion:(void (^)(NSString *res))completion {
[self POST:@"get_info" parameters:parameters success:^(NSURLSessionDataTask *task, id responseObject) {
if (completion) {
completion(responseObject);
}
}failure:^(NSURLSessionDataTask *task, NSError *error) {
if (completion){
completion(nil);
}
}];
}