-1

我正在使用 parse.com 作为我的应用程序的后端。我需要从我的后端获取信息并使用这些信息初始化一个实例。我使用此代码来做到这一点:

    - (id) initWithTeamId:(NSString *)teamId
{
__block NSString *str;
__block FrFTeam *blockSelf = self;
PFQuery *query = [PFQuery queryWithClassName:@"teams"];
[query getObjectInBackgroundWithId:teamId block:^(PFObject *object, NSError *error) {
    str = [object objectForKey:@"teamName"];
    (void)[blockSelf initWithName:str players:nil thumb:nil];
}];

return self;
}

当这段代码完成时 self.name 设置为 null,我做错了什么?谢谢你!

4

2 回答 2

0

试试这个代码:

// call init on the object, then setup the team id
- (id)initWithTeamId:(NSString *)teamId
{
    self = [super init];
    if (self) {
        [self setupWithTeamId:teamId];
    }

    return self;
}

- (void) setupWithTeamId:(NSString *)teamId
{
    __weak FrFTeam *blockSelf = self;

    PFQuery *query = [PFQuery queryWithClassName:@"teams"];
    [query getObjectInBackgroundWithId:teamId block:^(PFObject *object, NSError *error) {
        NSString *name = [object objectForKey:@"teamName"];
        NSLog(@"Received name: %@ from object: %@", name, object);
        [blockSelf setName:name];
    }];
}

然后,更改方法的名称,initWithName:...因为这不是真正的 init 方法,因为您在调用之前已经完成了 init setupWithTeamId:

如果您需要在 init 方法返回之前完成解析位,您应该:

  1. 在对对象调用 init 之前调用 parse 以获取详细信息
  2. 使用getObjectWithId:--- 不推荐,因为这会阻塞 init 中的线程,坏主意
于 2013-05-19T18:15:48.623 回答
0

很确定原因在于您正在调用的方法名称-getObjectInBackgroundWithId:block:(它指定了 InBackground,这表明该块在稍后的某个阶段而不是立即被调用)

这表明你最终得到 self == nil (因为你没有在方法中调用任何其他初始化程序。

对象的初始化必须是同步的。

于 2013-05-19T18:13:26.370 回答