如何从块中获取NSArray的数据?

时间:2015-10-21 13:54:31

标签: ios objective-c

每当我打电话给一个街区时,我的NSArray很清楚。有没有解决方案如何从块中获取数据?

- (void)reload {
    products = nil;
    products= [[NSArray alloc] init];
    [[RageIAPHelper sharedInstance] requestProductsWithCompletionHandler:^(BOOL success, NSArray *storeProducts) {
        if (success) {
            products = storeProducts;//i need products (NSArray)
        }
    }];}

然后它正在调用SKProductRequest。而且我知道这是一个回调。谢谢你的帮助:))

4 个答案:

答案 0 :(得分:1)

因为您正在修改块中的products var,所以需要将其声明为__block,以便变量将存在于共享存储中。如果不将其声明为__block,则var值将传递给块,并且无法修改。根据文件:

  

使用__block变量共享存储空间

     

如果您需要能够更改捕获变量的值   在一个块中,您可以使用__block存储类型修饰符   原始变量声明。这意味着变量存在于中   在原始词法范围之间共享的存储   变量和在该范围内声明的任何块。

See details here

答案 1 :(得分:0)

您的代码看起来没问题,因为当{em>请求完成并调用完成处理程序时,products(我假设为实例变量)将被分配。

(简而言之,如果要重新分配products= [[NSArray alloc] init];,则无需执行products

我认为你的问题是products在调用这个方法后仍然是空的,那是因为调用是异步(即运行在一个单独的执行线程中)一个称之为)。这就是完成处理程序模式的原因;存储收到的数据并通知你的其余代码。

因此,在完成处理程序块中执行额外工作之前,请忘记查看products,直到您告知它已准备就绪:

- (void)reload {
    products = nil;
    [[RageIAPHelper sharedInstance] requestProductsWithCompletionHandler:^(BOOL success, NSArray *storeProducts) {
        if (success) {
            products = storeProducts;

            // UPDATE UI - MUST BE DONE IN MAIN THREAD
            dispatch_sync(dispatch_get_main_queue(), ^{
                [self.tableView reload];    // Reload the tableview
            });

            // CALL A PRIVATE METHOD
            [self heyProductsHasUpdated];

        }
    }];
}

答案 2 :(得分:0)

试试这个:

- (void)reload 
{
    __block typeof(self) safeSelf = self;

    [[RageIAPHelper sharedInstance] requestProductsWithCompletionHandler:^(BOOL success, NSArray *storeProducts) 
    {
       if (success) 
       {
          [safeSelf setProducts:[NSArray arrayWithArray:storeProducts]];

          dispatch_async(dispatch_get_main_queue(), ^{
            [safeSelf.tableView reload];
          });
       }
    }];
}

答案 3 :(得分:-1)

声明这样的产品:

__block NSArray *products = [[NSArray alloc] init];