Maison > Questions et réponses > le corps du texte
正在学习Leancloud,想用一个工厂方法来封装查询代码,但是不能return block里的值,直接return objectID是空值,求指教,谢谢!
+ (NSString *)getObjectIDbyUsername:(NSString *)_username
{
__block NSString *objectID = NULL;
NSString *username = [NSString stringWithFormat:@"^%@$",_username];
AVQuery *query = [AVQuery queryWithClassName:@"_User"];
[query whereKey:@"username" containsString:username];
[query findObjectsInBackgroundWithBlock:^(NSArray *objects, NSError *error) {
objectID = [objects valueForKey:@"objectId"];
}];
return objectID;
}
高洛峰2017-04-18 09:57:47
Asynchrone :
+ (void)getObjectIDbyUsername:(NSString * )_username compelete:(void(^)(NSString * objectID))compelete{
NSString *username = [NSString stringWithFormat:@"^%@$",_username];
AVQuery *query = [AVQuery queryWithClassName:@"_User"];
[query whereKey:@"username" containsString:username];
[query findObjectsInBackgroundWithBlock:^(NSArray *objects, NSError *error) {
if (compelete) {
compelete(nil);
compelete = nil;
}
}];
}
// use:
[HTBaseContainer getObjectIDbyUsername:@"userName" compelete:^(NSString *objectID) {
}];
Synchronisation :
+ (NSString *)getObjectIDbyUsername:(NSString *)_username
{
dispatch_semaphore_t signal = dispatch_semaphore_create(1);
__block NSString *objectID = NULL;
NSString *username = [NSString stringWithFormat:@"^%@$",_username];
AVQuery *query = [AVQuery queryWithClassName:@"_User"];
[query whereKey:@"username" containsString:username];
[query findObjectsInBackgroundWithBlock:^(NSArray *objects, NSError *error) {
objectID = [objects valueForKey:@"objectId"];
dispatch_semaphore_signal(signal);
}];
dispatch_semaphore_wait(signal, DISPATCH_TIME_FOREVER);
return objectID;
}
高洛峰2017-04-18 09:57:47
Ajouter la forme de la méthode d'usine à un bloc et l'ID d'objet de rappel du bloc
dispatch_semaphore_t, attendez avant de retourner.
伊谢尔伦2017-04-18 09:57:47
Vous méritez d'avoir un groupe GCD. Si vous utilisez Swift, un bloc @escaping le fera. .