2015-04-08 3 views
1

У меня есть этот метод здесь:AFNetworking Успех и неудача называются не сделали

-(BOOL)User:(NSString *)user andPassWordExists:(NSString *)password 
{ 


    __block BOOL isLoggedIn = YES; 
    NSURL *url = [NSURL URLWithString:kIP]; 
    NSURLRequest *request = [NSURLRequest requestWithURL:url]; 

    AFHTTPRequestOperation *operation = [[AFHTTPRequestOperation alloc] 
             initWithRequest:request]; 

    [operation setCredential:[NSURLCredential credentialWithUser:[@"domain" stringByAppendingString:user] 
                 password:password persistence:NSURLCredentialPersistenceForSession]]; 



    [operation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) { 


     isLoggedIn = YES; 


    } failure:^(AFHTTPRequestOperation *operation, NSError *error) { 

     isLoggedIn = NO; 

    }]; 


    [operation start]; 
    return isLoggedIn; 
} 

я не получаю никаких ошибок, но когда я ставлю тормоза точки на успехе и неудаче, и ни один из них становится хитом. Я знаю, что URL-адрес верен, и я вижу, как передаются creds, я не знаю, в чем проблема?

UPDATE

Я изменил код так:

-(void)User:(NSString *)user andPassWordExists:(NSString *)password completionHandler:(void (^)(NSArray *resultsObject, NSError *error))completionHandler 
{ 


    NSURL *url = [NSURL URLWithString:kIP]; 
    NSURLRequest *request = [NSURLRequest requestWithURL:url]; 

    AFHTTPRequestOperation *operation = [[AFHTTPRequestOperation alloc] 
             initWithRequest:request]; 

    [operation setCredential:[NSURLCredential credentialWithUser:[@"domain" stringByAppendingString:user] 
                 password:password persistence:NSURLCredentialPersistenceForSession]]; 

    operation.responseSerializer = [AFJSONResponseSerializer serializer]; 

    [[NSOperationQueue mainQueue] addOperation:operation]; 

    [operation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) { 


    } failure:^(AFHTTPRequestOperation *operation, NSError *error) { 


    }]; 


    [operation start]; 
} 

Теперь мне нужно добавить это мой код:

[self fetchDataWithCompletionHandler:^(id responseObject, NSError *error) { 
    if (responseObject) { 

    } 
}]; 

, но когда я делаю, я получаю эта ошибка:

Use of undeclared identifier 'self' 

Я предполагаю, что это, где я смущен, потому что это, как я бы назвал этот метод из другого метода:

- (void)Login 
{ 
    NSString *rawString = [self.idTextField text]; 
    NSCharacterSet *whitespace = [NSCharacterSet whitespaceAndNewlineCharacterSet]; 
    [self.idTextField setText:[rawString stringByTrimmingCharactersInSet:whitespace]]; 
    BOOL *isAuthenticated = [userName User:self.idTextField.text andPassWordExists:self.passwordTextField.text]; 
    if(isAuthenticated != 0){ 

     [self.idTextField removeFromSuperview]; 
     [self.passwordTextField removeFromSuperview]; 
     [self.loginButton removeFromSuperview]; 
     self.idTextField = nil; 
     self.passwordTextField = nil; 
     self.loginButton = nil; 
     [self CreateMenu]; 
    }else{ 
     [self CustomAlert:@"Sorry Login Failed, User and/or Passsword Incorrect"]; 
    } 

    [indicatorView stopAnimating]; 
    [indicatorView removeFromSuperview]; 
    indicatorView = nil; 
    [loadingView removeFromSuperview]; 
    loadingView = nil; 

} 

Так внутри этого:

[self fetchDataWithCompletionHandler:^(id responseObject, NSError *error) { 
     if (responseObject) { 

     } 
    }]; 

я хотел бы либо вернуть истинным или ложным, и мой Метод входа по-прежнему будет работать?

UPDATE

Я обновил свой метод к этому:

-(void)User:(NSString *)user andPassWordExists:(NSString *)password completionHandler:(void (^)(NSArray *resultsObject, NSError *error))completionHandler 
{ 


    NSURL *url = [NSURL URLWithString:kIP]; 
    NSURLRequest *request = [NSURLRequest requestWithURL:url]; 

    AFHTTPRequestOperation *operation = [[AFHTTPRequestOperation alloc] 
             initWithRequest:request]; 

    [operation setCredential:[NSURLCredential credentialWithUser:[@"domain" stringByAppendingString:user] 
                 password:password persistence:NSURLCredentialPersistenceForSession]]; 

    operation.responseSerializer = [AFJSONResponseSerializer serializer]; 

    [[NSOperationQueue mainQueue] addOperation:operation]; 

    [operation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) { 

     if (completionHandler) { 
      completionHandler(responseObject, nil); 
     } 

    } failure:^(AFHTTPRequestOperation *operation, NSError *error) { 

     if (completionHandler) { 
      completionHandler(nil, error); 
     } 

    }]; 


    [operation start]; 

    [self User:^(id responseObject, NSError *error) { 
     if (responseObject) { 
      return true; 
     } 
    }]; 
} 

Две вещи неправильно здесь ....

Я получаю сообщение об ошибке в конце моего fetchDataWithCompletionHandler кода:

/Users/jsuske/Documents/SSiPad(Device Only)ios7/SchedulingiPadApplication/Classes/LHJSonData.m:237:5: Control may reach end of non-void block 

и я получаю t его предупреждение:

/Users/jsuske/Documents/SSiPad(Device Only)ios7/SchedulingiPadApplication/Classes/LHJSonData.m:233:11: Instance method '-fetchDataWithCompletionHandler:' not found (return type defaults to 'id') 

Я приближаюсь?

+1

Это асинхронный метод, так что вы не можете вернуть 'isLoggedIn'. Вероятно, вам нужен асинхронный шаблон, такой как параметр блока завершения для этого метода. См. Http://stackoverflow.com/a/18880292/1271826 или http://stackoverflow.com/a/21741028/1271826 или http://stackoverflow.com/a/27250104/1271826. – Rob

+0

Я действительно не понимаю этих андерсеров. Я использовал ASIHTTPRequest, и это было намного проще, я бы хотел, чтобы я все еще мог его использовать, можете ли вы поместить то, что я должен ответить, – user979331

+0

AFNetworking работает асинхронно, это означает (простой пример), если вы выполняете запрос, ваш ui не заблокирован. Таким образом, вы не можете вернуть значение в свой метод, потому что метод, возможно, завершен до того, как ваш запрос будет завершен. – q0re

ответ

1

Это отличный старт. Я бы предложил

  • замена крышки просто BOOL;

  • исключить запуск операции до тех пор, пока вы не закончите настройку всего (и либо вызовите start, либо добавьте его в очередь, но не оба); и

  • устранить звонок user в конце.

Таким образом

- (void)verifyUserid:(NSString *)user password:(NSString *)password completionHandler:(void (^)(BOOL success, NSError *error))completionHandler 
{ 
    NSURL *url = [NSURL URLWithString:kIP]; 
    NSURLRequest *request = [NSURLRequest requestWithURL:url]; 

    AFHTTPRequestOperation *operation = [[AFHTTPRequestOperation alloc] initWithRequest:request]; 

    [operation setCredential:[NSURLCredential credentialWithUser:[@"domain" stringByAppendingString:user] 
                 password:password persistence:NSURLCredentialPersistenceForSession]]; 

    operation.responseSerializer = [AFJSONResponseSerializer serializer]; 

    [operation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) { 
     if (completionHandler) { 
      completionHandler(TRUE, nil); 
     } 
    } failure:^(AFHTTPRequestOperation *operation, NSError *error) { 
     if (completionHandler) { 
      completionHandler(FALSE, error); 
     } 
    }]; 

    [operation start]; 
} 

Я также изменил название метода в соответствии с соглашениями какао (начинаются с глагола, имена методов всегда начинаются с буквы в нижнем регистре), но это скорее стилистическое дело, чем все остальное.

Теперь вы можете вызвать этот метод с чем-то вроде:

[self verifyUserid:user password:password completionHandler:^(BOOL success, NSError* error) { 
    if (success) { 
     // userid/password ok; do anything related to successful login here 
    } else { 
     // not ok 
    } 
}]; 

// note, we're not logged in yet (the above completion block is called later), 
// so don't assume we're logged in or not here