我有这个代码:
- (NSString *) login {
datos=@"";
NSString __block *variable;
NSString *sqlQueryExisteUsuario;
sqlQueryExisteUsuario = [[NSString alloc] initWithFormat:@"SELECT COUNT(*) FROM tableName WHERE field='value' AND field='value'"];
SQLClient* client = [SQLClient sharedInstance];
client.delegate = self;
[client connect:@"serverName" username:@"username" password:@"password" database:@"database" completion:^(BOOL success) {
[client execute:sqlQueryExisteUsuario completion:^(NSArray* results) {
variable = [self processLogin:results];
NSLog(@"In: %@",variable);
[client disconnect];
}];
}];
NSLog(@"Out: %@",variable);
return nil;
}
- (NSString *)processLogin:(NSArray*)data
{
existeArray = [NSMutableArray array];
for (NSArray* table in data)
for (NSDictionary* row in table)
for (NSString* column in row)
[existeArray addObject:row[column]];
NSString *existe=existeArray[0];
if([existe isEqualToString:@"1"])
{
datos=@"yes";
}else{
datos=@"no";
}
return datos;
}
在以In
开头的对NSLog
的第一次调用中,值显示。在以 Out
开头的第二个调用中,该值未显示。为什么?
最佳答案
您的connect
是异步方法,因此NSLog...
行将在completion
block 之前执行。所以,你还必须使用 block :
- (NSString *) loginWithCompletion:(void(^)(NSString *result))handler
{
datos=@"";
NSString *sqlQueryExisteUsuario;
sqlQueryExisteUsuario = [[NSString alloc] initWithFormat:@"SELECT COUNT(*) FROM tableName WHERE field='value' AND field='value'"];
SQLClient* client = [SQLClient sharedInstance];
client.delegate = self;
[client connect:@"serverName" username:@"username" password:@"password" database:@"database" completion:^(BOOL success) {
if (success) {
[client execute:sqlQueryExisteUsuario completion:^(NSArray* results) {
NSString *variable = [self processLogin:results];
NSLog(@"In: %@",variable);
[client disconnect];
if (handler) {
handler (variable);
}
}];
} else {
//TODO: handle this
if (handler) {
handler (nil);
}
}
}];
}
用法:
- (void)ff
{
[self loginWithCompletion:^(NSString *variable) {
//Do something with variable
}];
}
关于ios - 在外部函数中返回内部值函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34337934/