我正在尝试遍历数组并将项添加到新数组中。 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
之后显示为空。这有什么意义吗?
答案 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块发送查询请求,解析该查询的结果,然后递增查询索引并启动新查询是否有更多要获取。