我有一个名为“ malls”的NSArray,其中包含大量我上载到Parse.com的NSDictionaries(每个特定的购物中心)。 我希望我的用户能够访问此信息以创建地图注释。

我尝试用两种不同的方法来做到这一点:

  1. 我尝试上传整个数组作为单个对象的属性:

这是上传:

在dataBank.h文件中:

@property (strong, nonatomic) NSMutableArray* malls;

在.m文件中

PFObject *obj = [PFObject objectWithClassName:@"malls"];
obj[@"mallsData"] = self.malls;
[obj saveInBackground];

我尝试从解析中获取数据:

-(NSMutableArray *)createAnnotationsFromParse
{
    __block NSMutableArray* data = [[NSMutableArray alloc]init];
    __block NSMutableArray* annots = [[NSMutableArray alloc]init];

PFQuery* query = [PFQuery queryWithClassName:@"malls"];
[query getObjectInBackgroundWithId:@"Eaib9yfTRe" block:^(PFObject *object, NSError *error) {
    data = [object objectForKey:@"mallsData"];
    annots = [self createAnnotations:data];
}];

return annots;
}

问题是getObjectInBackground是异步的,总是在从服务器获取数据之前返回。 我尝试在代码块内移动“返回注释”,但出现以下错误:“不兼容的块指针类型”。

  1. 我将5个“购物中心”对象上传到“ malls2”类。 每个对象都有2个属性-名称和地址:

     for(int i = 0; i < 5; i++) { PFObject *mallsObj = [PFObject objectWithClassName:@"malls2"]; mallsObj[name] = [[self.malls objectAtIndex:i]objectForKey:name]; mallsObj[address] = [[self.malls objectAtIndex:i]objectForKey:address]; [mallsObj saveInBackgroundWithBlock:^(BOOL succeeded, NSError *error) { if(succeeded) NSLog(@"yay"); else NSLog(@"%@", error.description); }]; 

    }

然后我尝试找回它:

-(NSMutableArray *)createAnnotationsFromParse
{
    __block Annotation* anno = [[Annotation alloc]init];
    __block NSMutableArray* annots = [[NSMutableArray alloc]init];

    PFQuery* query = [PFQuery queryWithClassName:@"malls2"];

    [query findObjectsInBackgroundWithBlock:^(NSArray *objects,  NSError *error) {
        if(error)
            NSLog(@"%@", error.description);
        else
        {
            for(int i = 0; i < [objects count]; i++)
            {
                    //createAnnotationWithTitle is a func in a different class that creates the annotation
                    anno = [anno createAnnotationWithTitle:[[objects objectAtIndex:i] objectForKey:name] andAddress:[[objects objectAtIndex:i]objectForKey:address]];
            }
            [annots addObject:anno];
        }
    }];

    return annots;
}

我得到5个对象,但它们都空了。

===============>>#1 票数:0

对于带有块参数的异步方法,这是一个基本的误解。 诀窍是摆脱习惯,即稍后出现在源文件中的代码会稍后运行。 该假设适用于以下功能:

- (void)regularFunction {
    // these NSLogs run top to bottom
    NSLog(@"first");
    NSLog(@"second");
    NSLog(@"third");
}

这将生成日志:第一,第二,第三。 从上到下,但不在此范围内:

- (void)functionThatMakesAsynchCall {
    // these NSLogs do not run top to bottom
    NSLog(@"first");
    [someObject doSomeAsynchThing:^{
        NSLog(@"second");
    }];
    NSLog(@"third");
}

该函数将生成日志-第一,第三,第二。 在“第三” NSLog之后,“第二” NSLog将运行良好。

那你该怎么办? 直到完成后,才尝试使用解析调用的结果更新UI,如下所示:

// declared void because we can't return anything useful
- (void)doSomeParseThing {
    // if you change the UI here, change it to say: "we're busy calling parse"
    PFQuery* query = [PFQuery queryWithClassName:@"malls2"];
    [query findObjectsInBackgroundWithBlock:^(NSArray *objects,  NSError *error) {
        if(!error) {
            // change the UI here, say by setting the datasource to a UITableView
            // equal to the objects block parameter
        }
    }];

    // don't bother changing the UI here
    // don't bother returning anything here
    // we just started the request
}

但是,如果doSomeParseThing是一个模型函数,其唯一的工作就是从解析中获取内容, doSomeParseThing不了解UI,那该怎么办? 这是一个非常合理的想法。 为了解决这个问题,您需要使用block参数以解析方式构建模型方法来构建模型方法:

// in MyModel.m
// declared void because we can't return anything useful
+ (void)doSomeParseThing:(void (^)(NSArray *, NSError *))block {
    PFQuery* query = [PFQuery queryWithClassName:@"malls2"];
    [query findObjectsInBackgroundWithBlock:^(NSArray *objects,  NSError *error) {
        block(objects, error);
    }];
}

现在,您的视图控制器可以调用,将查询工作留给模型,将UI工作留给vc:

// change UI to 'busy' here
[MyModel doSomeParseThing:^(NSArray *objects, NSError *error) {
    // update UI with objects or error here
}];

===============>>#2 票数:0 已采纳

弄清楚了。 看起来我正在获取“空对象”(可以在此处postimg.org/image/ot7ehn29b看到),但是一旦我尝试从对象访问数据,我就发现没有问题。 基本上,我被显示为“ 0个对象”的数组中的PFObjects所欺骗,并认为这意味着它们是从Parse.com空回来的。 这是我检查的方式,仅供参考:

PFQuery *query = [PFQuery queryWithClassName:@"malls2"];
NSArray *array = [query findObjects];
NSLog(@"%@", [[array objectAtIndex:0] objectForKey:@"name"]; // I have a string property called "name" in my Parse object.

  ask by Nadav Etinzon translate from so

未解决问题?本站智能推荐:

1回复

从Parse.com返回对象时,setObjectForKey:对象不能为零

我从Parse类将许多对象返回到UITableView。 尝试打开视图时出现此错误: 这是我的做法:
1回复

无法从Parse.com iOS中的User类返回对象

我试图使用UISearchBar和UITableView从我的User类返回用户。 由于某种原因,我无法从Parse的User类中检索任何对象。 您是否知道即使User类中有很多用户,为什么我也无法获得任何对象? 这是我的做法:
1回复

带有findObjectsInBackgroundWithBlock的简单Parse.com不返回

我试图从解析查询_User类以在TableViewCell上使用它。 我从中得到零价值。 我确实使用一次简单但不建议的查询同时运行了它: 工作查询(不推荐): 无法运作的查询: } 我从Parse继承了_User类(仅供参考)
1回复

Parse.com API:如何逐步查询对象?

我有一个表视图控制器,它从parse.com托管的数据库中获取对象。 目前,我让视图控制器获取数据库中的所有对象以存储在数组中。 现在,数据库中有100个对象,我想要做的是让表视图控制器获取这些对象中的20个并显示它们,然后在表滚动到底部时再获取并显示20个。 这是我的init方法:
4回复

Parse.com保存对象一次

我将一个名为item的PFObject保存到一个名为Objects的类中。 因此,该类是Objects ,在该类中,我有一列称为item(它们是字符串对象)。 每次点击tableView的一行时,应用程序都会保存该行的文本以进行分析。 例如,如果您点击此行3次,它将保存文本3次不同的时
1回复

iOS Parse.com更新对象

我正在建立一个使用parse作为后端的照片共享应用程序。 现在,我想在用户单击“赞”按钮后使用以下命令更新每个照片对象的numberOfLikes属性: 我的问题是,假设有多个用户同时喜欢同一张照片,这些喜欢的请求是否会在处理队列中? (Parse会一一处理吗?)假设这张照片有0个赞
1回复

这会将对象存储为数组吗? parse.com

我想知道我的代码是否在parse.com中获取一个数组并将其正确添加到我的NSMutableArray中。 在ViewdidLoad中: 它的作用是:获取与当前用户的帖子共享的所有用户的objectId。 (当前用户可以与其他用户分享信息) MY NSLog显示以下内容:
4回复

iOS Parse.com内部查询不会获取所有对象

我在使用parse.com内部查询时遇到麻烦。 这是我的代码。 这是一个问题。 在Parse.com中,内部查询最大限制计数也是1000。 在我的代码中,在User类中检索1000个对象并在它们之间执行查询。 如果用户数超过1000,则其他用户不在内部查询中。 所以我不能得到它
1回复

如何在课堂上获取Parse.com对象计数

我想从Parse.com中的5个类中获取对象计数(以检查是否成功获取了所有对象)。 因为我使用的是findObjectsInBackgroundWithBlock :有时在使用它之前并非所有对象都已获取,所以这就是为什么要检查的原因。 我怎样才能做到这一点?
3回复

Parse.com如何知道数组是否包含对象

有一个PFQuery的方法 是否有类似的方法来定义数组中是否有指定的对象? 喜欢 如果不是,如何自己编写此方法?