recherche

Maison  >  Questions et réponses  >  le corps du texte

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

正在学习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;
}
PHP中文网PHP中文网2767 Il y a quelques jours485

répondre à tous(3)je répondrai

  • 高洛峰

    高洛峰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;
    }

    répondre
    0
  • 高洛峰

    高洛峰2017-04-18 09:57:47

    1. Ajouter la forme de la méthode d'usine à un bloc et l'ID d'objet de rappel du bloc

    2. dispatch_semaphore_t, attendez avant de retourner.

    répondre
    0
  • 伊谢尔伦

    伊谢尔伦2017-04-18 09:57:47

    Vous méritez d'avoir un groupe GCD. Si vous utilisez Swift, un bloc @escaping le fera. .

    répondre
    0
  • Annulerrépondre