在块内添加数组

时间:2014-01-30 17:58:58

标签: ios objective-c stackmob

我正在尝试遍历数组并将项添加到新数组中。 addObject部分存在于块内。有些东西似乎阻止了任何对象被添加到我的新数组中。我想知道该块是否会导致问题。

它是这样的:

-(void)queryForID
{
    NSLog(@"QUERY FOR ID");
    self.REST = [[AIREST alloc] init];
    [self.REST querySchema:@"business" searchString:@"object_id" fromArray:self.json.objects];
}

AIREST.h

#import <Foundation/Foundation.h>
#import "StackMob.h"

@interface AIREST : NSObject

-(void)querySchema:(NSString *)schema searchString:(NSString *)searchString fromArray:(NSArray *)searchArray;

@property (nonatomic, strong) NSMutableArray *queryResults;

@end

AIREST.m

-(void)querySchema:(NSString *)schema searchString:(NSString *)searchString fromArray:(NSArray *)searchArray
{
    self.queryResults = [[NSMutableArray alloc] init];

    for (int i = 0; i < [searchArray count]; i++)
    {
        MyObject *myObject = searchArray[i];
        SMQuery *newQuery = [[SMQuery alloc] initWithSchema:schema];
        [newQuery where:searchString isEqualTo:myObject.objectID];

        [[[SMClient defaultClient] dataStore] performQuery:newQuery onSuccess:^(NSArray *results) {
            // results contains an array of dictionary objects that match the query
            if ([results count] > 0)
            {
                [self.queryResults addObject:results];
                NSLog(@"QUERY: %@", self.queryResults);
            }
        } onFailure:^(NSError *error) {
            // Error
            NSLog(@"QUERY ERROR: %@", error);
        }];
    }
    [[NSNotificationCenter defaultCenter] postNotificationName:@"gotQueryResults" object:nil];
}

在循环结束时,NSLog会打印self.queryResults的内容,但self.queryResults之后显示为空。这有什么意义吗?

3 个答案:

答案 0 :(得分:0)

您的成功和失败块是异步的。因此,在postNotificationName:中添加对象之前,可以调用self.queryResults。尝试使用断点来查看代码的工作方式。

答案 1 :(得分:0)

而不是

@property (nonatomic, strong) NSMutableArray *queryResults;

使用

@property (nonatomic, strong) __block NSMutableArray *queryResults;
希望这会奏效。

答案 2 :(得分:0)

您的代码使用了几个您没有告诉我们的类。 AIREST,如上面teh1所述。

您也在使用SMClient类,它看起来像是github上的一个开源项目。你应该说明一下,告诉我们它的作用以及它是如何运作的。

根据你正在使用的方法的方法名称,执行:onSuccess:onFailure :,听起来像这个方法做了某种异步网络提取。

如果我是对的,它会立即返回,然后一旦查询完成,就会执行“onSuccess”块中的代码。

您的代码正在排队整批查询。当你离开for循环时,你的所有提取都没有完成。事实上,第一个查询请求的第一个字节可能已经通过网络发送了。

因此,在下一个语句中,您将在查询执行之前发布包含查询结果的通知。

由于您在for循环中启动多个查询,因此您必须聪明地确定何时完成所有查询。

处理此问题的一种方法是重写代码以获得查询索引实例变量,并编写代码以使用onSuccess块发送查询请求,解析该查询的结果,然后递增查询索引并启动新查询是否有更多要获取。