objective-c - ios中,用工厂方法如何return block里的值?

浏览:34日期:2023-12-24

问题描述

正在学习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;}

问题解答

回答1:

异步:

+ (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) { }];

同步:

+ (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;}回答2:

把工厂方法的形参加一个block, block 回调objectID

dispatch_semaphore_t, 在return前一直wait.

回答3:

GCD group你值得拥有,假如用swift的话一个@escaping block就搞定了。。

相关文章: