无法在块外引用数组

时间:2014-11-25 17:45:21

标签: ios arrays url methods

我有一个名为'场所'的数组,我正在用以下方法生成。我试图在不同的方法中重用它,但每次我尝试以不同的方法访问它时,数组都是'null'。方法是:

- (void)startSearchWithString:(NSString *)string {
    [self.lastSearchOperation cancel];
    self.lastSearchOperation = [Foursquare2
        venueSearchNearLocation:@"Chicago" query:nil limit:nil intent:intentCheckin radius:nil categoryId:string
            callback:^(BOOL success, id result){
            if (success) {

                NSDictionary *dic = result;
                NSArray *venuesDic = [dic valueForKeyPath:@"response.venues"];
                self.venues = [SearchVenue placesWithArray:venuesDic];
                NSLog(@"self.venues inside is %@",self.venues);
            } else {
                NSLog(@"%@",result);
            }
        }];
    NSLog(@"self.venues outside is %@",self.venues);
}

日志内容中的自我。 self.venues外部日志(null)。 我正在尝试__block但没有成功。

在我的.h我有:

@property (strong, nonatomic) NSArray *venues;

2 个答案:

答案 0 :(得分:0)

回调块在venueSearchNearLocation完成后异步执行。

您的日志代码:

NSLog(@"self.venues outside is %@",self.venues);

可能会在回调块之前执行,因此self.venues仍为零。

您必须在回调块完成后访问self.venues。

你如何做到这真的取决于你的应用程序。丢失耦合的一种方法是在设置阵列后发布通知。

[[NSNotificationCenter defaultCenter] postNotificationName:
                                      @"VENUES_RECEIVED " object:nil];

在某些初始化程序中,您需要收听该通知:

[[NSNotificationCenter defaultCenter] addObserver:self
                                      selector:@selector(receivedVenus)
                                      name:@"VENUES_RECEIVED" object:nil];

当然,您需要一种可以使用数组的方法

- (void) receivedVenus
{
    NSLog(@"self.venues outside is %@",self.venues);
}

不要忘记删除您的观察者(即在dealloc中)

    [[NSNotificationCenter defaultCenter] removeObserver:self];

答案 1 :(得分:-1)

尝试

NSArray *venuesDic = [NSArray arrayWithArray:[dic valueForKeyPath:@"response.venues"]];