AFNetworking不兼容的块指针类型发送

时间:2015-04-07 19:57:25

标签: ios objective-c afnetworking asihttprequest

我正在使用AFNetworking访问带有Windows身份验证的网址。我正在使用ASIHTTPRequest进行登录:

-(BOOL)User:(NSString *)user andPassWordExists:(NSString *)password
{
    NSURL *url = [NSURL URLWithString:kIP];
    ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];
    [request setUseSessionPersistence:YES];
    [request setUseKeychainPersistence:NO];
    [request setUsername:user];
    [request setPassword:password];
    [request setDomain:@"domain"];
    [request startSynchronous];

    NSError *loginError = [request error];
    if(loginError == nil){
        return true;
    }else{
        return false;
    }

}

现在我正在尝试使用AFNetworking做同样的事情,这就是我从这个例子中得出的结论:http://www.raywenderlich.com/forums/viewtopic.php?f=2&t=18385

-(BOOL)User:(NSString *)user andPassWordExists:(NSString *)password
{
    NSURL *url = [NSURL URLWithString:kIP];

    NSURLRequest *request = [NSURLRequest requestWithURL:url
                                             cachePolicy:NSURLRequestReloadIgnoringLocalAndRemoteCacheData
                                         timeoutInterval:90.0];
    AFHTTPRequestOperation *operation = [[AFHTTPRequestOperation alloc]
                                         initWithRequest:request];
    [operation setCredential:[NSURLCredential credentialWithUser:[@"domain" stringByAppendingString:user]
                                                        password:password persistence:NSURLCredentialPersistenceNone]];
    operation.responseSerializer = [AFJSONResponseSerializer serializer];


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

        return true;

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

        return false;

    }];
    [operation start];
}

但这给了我两个错误:

/Users/jsuske/Documents/SSiPad(Device Only)ios7/SchedulingiPadApplication/Classes/LHJSonData.m:148:46: Incompatible block pointer types sending 'int (^)(AFHTTPRequestOperation *__strong, __strong id)' to parameter of type 'void (^)(AFHTTPRequestOperation *__strong, __strong id)'

/Users/jsuske/Documents/SSiPad(Device Only)ios7/SchedulingiPadApplication/Classes/LHJSonData.m:152:15: Incompatible block pointer types sending 'int (^)(AFHTTPRequestOperation *__strong, NSError *__strong)' to parameter of type 'void (^)(AFHTTPRequestOperation *__strong, NSError *__strong)'

如何创建一个使用用户和密码登录和存储这些凭据的方法......这可以通过AFNetworking实现,确实是ASIHTTPRequest

1 个答案:

答案 0 :(得分:1)

我认为你是misunderstanding blocks。您将从回调块返回TRUE / FALSE您的方法。这些块将在将来的某个时刻执行,其返回类型为void。尝试运行此代码以查看订单:

-(void)User:(NSString *)user andPassWordExists:(NSString *)password
{
    // construct your request

    [operation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) {
        NSLog(@"In success block");
    } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
        NSLog(@"In Fail block");
    }];
    [operation start];

    NSLog(@"Network op started");
}

至于你的设计,我不会回归真或假,你必须找到另一种方法来管理成功和失败的场景,可能看起来像这样(我不知道关于你的整体设计给出一个明确的答案):

-(void)User:(NSString *)user andPassWordExists:(NSString *)password
{
    // construct your request

    __weak typeof(self) weakSelf = self;
    [operation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) {
        // called at somepoint in the future if the request is success full
        [weakSelf handleSuccess:responseObject];
    } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
        // called at somepoint in the future if the request fails
        [weakSelf handleFail:error];
    }];
    [operation start];
}

- (void)handleSuccess(id)response {
    // process the response
}

- (void) handleFail:(NSError*)error {
    // evaluate error
}

你在这里看到了bock声明:https://github.com/AFNetworking/AFNetworking/blob/master/AFNetworking/AFHTTPRequestOperation.h