[英]Adding to an array while inside a block
我试图遍历一个数组并将项添加到一个新的数组。 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
之后显示为空。 这有道理吗?
您的成功和失败模块都是异步的。 所以postNotificationName:
可以在添加对象之前调用self.queryResults
。 尝试使用断点来查看代码的工作方式。
代替
@property (nonatomic, strong) NSMutableArray *queryResults;
采用
@property (nonatomic, strong) __block NSMutableArray *queryResults;
希望这会起作用。
您的代码使用了几个您没有告诉我们的类。 如上面teh1所述,AIREST。
您还将使用SMClient类,它看起来像是github上的一个开源项目。 您应该声明这一点,告诉我们它的工作方式和工作方式。
根据您使用的方法的方法名称,performQuery:onSuccess:onFailure :,在我看来,这种方法可以进行某种异步网络获取。
如果我是对的,它将立即返回,然后在查询完成后,将执行“ onSuccess”块中的代码。
您的代码正在排队整批查询。 当您退出for循环时,您的提取均未完成。 实际上,第一个查询请求的第一个字节可能甚至已经通过网络发送。
因此,在下一条语句中,您将在查询执行之前发布包含查询结果的通知。
由于您要在for循环中启动多个查询,因此您将不得不聪明地弄清楚何时完成所有查询。
解决此问题的一种方法是重写代码以获取查询索引实例变量,并编写代码以发送带有onSuccess块的查询请求,以解析该查询的结果,然后递增查询索引并在以下情况下启动新查询还有更多需要获取的东西。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.