【问题标题】:Blocks in objective C /Parse query [duplicate]目标 C /Parse 查询中的块 [重复]
【发布时间】:2015-02-08 09:48:27
【问题描述】:

我有一个使用 parse query 获取成员列表的函数。我有一个 NSMutableArray 类型的属性,它应该存储名为 subscribers 的列表结果。我有两个代码块。一个块获取日期,一旦我有了日期,我就会调用另一个函数,该函数进一步调用解析云方法。这是代码

-(void) fetchMemberList{

PFQuery *query=[PFQuery queryWithClassName:@"GroupMembers"];
[query fromLocalDatastore];
[query orderByAscending:@"updatedAt"];
[query whereKey:@"iosUserID" equalTo:[PFUser currentUser].objectId];
[query findObjectsInBackgroundWithBlock:^(NSArray *objects, NSError *error) {
if(error)
{

}
else{

    if(objects.count==0) {
        _latestTime=[PFUser currentUser].createdAt;
    }

    else {
        PFObject *member=[objects objectAtIndex:0];
        _latestTime =member.createdAt;
    }

    [Data getMemberList:_latestTime successBlock:^(id object) {

        NSMutableDictionary *members = (NSMutableDictionary *) object;

        NSArray *appUser= [members objectForKey:@"app"];
        NSArray *phoneUser=[members objectForKey:@"sms"];
        if(appUser.count>0){
        for(PFObject * appUs in appUser)
        {
            appUs[@"iosUserID"]=[PFUser currentUser].objectId;
            NSString *obj= [appUs objectForKey:@"name"];
            NSString *child= [appUs objectForKey:@"childern_names"];
            if(child.length>0)
            {
                [_subscriber addObject:child];
            }
            else if(obj.length>0)
            {
                [_subscriber addObject:obj];

            }


            }
            [PFObject pinAllInBackground:appUser];

        }

        if(phoneUser.count>0){
        for(PFObject * phoneUs in phoneUser)
        {
            phoneUs[@"iosUserID"]=[PFUser currentUser].objectId;
            NSString *obj= [phoneUs objectForKey:@"subscriber"];
            NSString *child= [phoneUs objectForKey:@"number"];
            if(child.length>0)
            {
                [_subscriber addObject:child];
            }
            else if(obj.length>0)
            {
                [_subscriber addObject:obj];

            }

        }
            [PFObject pinAllInBackground:phoneUser];

        }


       NSLog(@"%@ subscriber in fetch method",_subscriber);
    } errorBlock:^(NSError *error) {

    }];


}


}];


}

在我的 viewdidload 函数中:-

- (void)viewDidLoad {
[super viewDidLoad];
_subscriber=[[NSMutableArray alloc]init];


[self fetchMemberList];
NSLog(@"%@ in viewdidLoad",_subscriber);

}

因此,viewdidLoad 中的日志不会打印任何内容,但方法中的 one 会给出名称列表。我想将列表存储在数组中并将其放入 tableview 中。我在这里错过了什么?

【问题讨论】:

  • 这就是异步进程的本质。如果您对此感到困惑,请尝试避免阻塞。你的代码可能会变得更长,但最终更容易理解,尤其是当你的代码块变得和你的一样大时。

标签: ios objective-c parse-platform objective-c-blocks


【解决方案1】:

findObjectsInBackgroundWithBlock: 块是异步的,所以 _subscriber isn't immediately available to print after you call yourfetchMemberList` 方法。这就是为什么块中的那个实际上会为您提供名称列表 - 因为到那时回调已完成。

【讨论】:

    猜你喜欢
    • 2011-02-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-06
    相关资源
    最近更新 更多