2014-01-30 6 views
0

배열을 반복하고 새로운 배열에 항목을 추가하려고합니다. 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]; 
} 

를 루프의 끝에서 NSLogself.queryResults 인쇄의 내용, 이후 self.queryResults이 비어있는 것으로 나타납니다. 이게 말이 되니?

+1

게시하시기 바랍니다. AIREST.h – teh1

+0

게시하기 전에 'self.queryResults'를 출력하는 NSLog는 어디에 있습니까? –

답변

0

성공 및 실패 블록이 비동기입니다. 따라서 postNotificationName:self.queryResults에있는 오브젝트를 추가하기 전에 호출 될 수 있습니다. 중단 점을 사용하여 코드 작동 방식을 확인하십시오. 대신이 작동

@property (nonatomic, strong) NSMutableArray *queryResults; 

사용

@property (nonatomic, strong) __block NSMutableArray *queryResults; 

희망의

0

코드에서 알려주지 않은 여러 클래스를 사용하고 있습니다. AIREST, 위의 teh1에서 언급했듯이

github의 오픈 소스 프로젝트 인 것처럼 보이는 SMClient 클래스도 사용하고 있습니다. 당신은 그것이 무엇인지, 어떻게 작용 하는지를 말해 주어야합니다.

사용중인 메소드의 메소드 이름에 따라 performQuery : onSuccess : onFailure :를 수행하면이 메소드가 비동기 네트워크 가져 오기를 수행하는 것처럼 들립니다.

맞으면 즉시 반환하고 쿼리가 완료되면 "onSuccess"블록의 코드가 실행됩니다.

코드가 전체 쿼리 일괄 처리를 대기 중입니다. for 루프를 종료하면 가져 오기가 완료되지 않습니다. 실제로 첫 번째 쿼리 요청의 첫 번째 바이트가 네트워크를 통해 전송 된 것일 수도 있습니다.

따라서 다음 문장에서는 쿼리가 실행되기 전에 쿼리 결과와 함께 알림을 게시합니다.

for 루프에서 여러 개의 쿼리를 시작하기 때문에 모든 쿼리가 완료되면 알아 내야합니다.

이 문제를 처리하는 한 가지 방법은 쿼리 인덱스 인스턴스 변수를 포함하도록 코드를 다시 작성하고 onSuccess 블록에서 쿼리 요청을 보내고 해당 쿼리에 대한 결과를 구문 분석 한 다음 쿼리 인덱스를 증가시키고 시작하는 코드를 작성하는 것입니다. 추가 쿼리가있을 경우 새로운 쿼리.