我正在使用新的iOS Spotify SDK。我需要为我的应用程序获取用户保存的所有曲目。结果是分页的。因此,我尝试递归使用requestNextPageWithSession:callback:直到获取了所有页面。

首先,我最初请求保存的曲目。这将成功返回首页,因此,如果还有其他页面,我将调用getNextPage()

__block SPTListPage *allPages;
[SPTRequest savedTracksForUserInSession:session callback:^(NSError *error, SPTListPage *firstPage) {
   if (!error) {
      allPages = firstPage;
      if (firstPage.hasNextPage) {
         getNextPage(firstPage);
      }
      else {
         // All tracks were in the first page
      }
   }
}];


getNextPage()被声明为上面的代码块,如下所示:

Block getNextPage;
getNextPage = ^(SPTListPage *page) {
    [page requestNextPageWithSession:session callback:^(NSError *error, SPTListPage *nextPage) {
        if (!error) {
            [allPages pageByAppendingPage:nextPage];
            if (nextPage.hasNextPage) {
                getNextPage(nextPage);
            }
            else {
                // Got all pages
            }
        }
    }];
};


仅供参考-我已将“块”定义为在全球范围内使用:

typedef void (^Block)();


问题是我第一次尝试在该块内递归使用getNextPage()时,该行崩溃并在该行上显示EXC_BAD_ACCESS。 stacktrace并没有帮助,但看起来好像已释放getNextPage。希望有人解决了类似的问题。

最佳答案

您必须保存对块的引用,否则在执行到达作用域末尾时将其清除。您可以在保存它的类上创建一个属性。

@property (nonatomic, copy) Block block;


或者,您可以只使用方法。

- (void)fetchNextPage:(SPTListPage *)page {
  [page requestNextPageWithSession:session callback:^(NSError *error, SPTListPage *nextPage) {
    if (!error) {
      [allPages pageByAppendingPage:nextPage];
      if (nextPage.hasNextPage) {
        [self fetchNextPage:nextPage];
      }
      else {
        // Got all pages
      }
    }
  }];
}

10-04 11:37