RestKit Paginator崩溃:无法确定hasNextPage:未加载paginator

时间:2014-06-11 01:06:49

标签: ios restkit restkit-0.20

出于某种原因,我随机有时会遇到这种情况。

Fatal Exception: NSInternalInconsistencyException
Cannot determine hasNextPage: paginator is not loaded.

Thread : Fatal Exception: NSInternalInconsistencyException
0  CoreFoundation                 0x309a1f4b __exceptionPreprocess + 130
1  libobjc.A.dylib                0x3b1386af objc_exception_throw + 38
2  CoreFoundation                 0x309a1e25 +[NSException raise:format:]
3  Foundation                     0x31349fe3 -[NSAssertionHandler handleFailureInMethod:object:file:lineNumber:description:] + 90
4  Poka                           0x004f0f71 -[RKPaginator hasNextPage] (RKPaginator.m:151)
5  Poka                           0x00289a41 __66-[PokaLocationContentManagerSingleton fetchLatestPlantsWithCount:]_block_invoke (PokaLocationContentManagerSingleton.m:345)
6  Poka                           0x004f2495 __24-[RKPaginator loadPage:]_block_invoke157 (RKPaginator.m:231)
7  Poka                           0x004e9355 __66-[RKObjectRequestOperation setCompletionBlockWithSuccess:failure:]_block_invoke244 (RKObjectRequestOperation.m:477)
8  libdispatch.dylib              0x3b61bd1b _dispatch_call_block_and_release + 10
9  libdispatch.dylib              0x3b61bd07 _dispatch_client_callout + 22
10 libdispatch.dylib              0x3b62278d _dispatch_main_queue_callback_4CF$VARIANT$mp + 268
11 CoreFoundation                 0x3096c819 __CFRUNLOOP_IS_SERVICING_THE_MAIN_DISPATCH_QUEUE__ + 8
12 CoreFoundation                 0x3096b0ed __CFRunLoopRun + 1300
13 CoreFoundation                 0x308d5c27 CFRunLoopRunSpecific + 522
14 CoreFoundation                 0x308d5a0b CFRunLoopRunInMode + 106
15 GraphicsServices               0x355c9283 GSEventRunModal + 138
16 UIKit                          0x33179049 UIApplicationMain + 1136
17 Poka                           0x0006df95 main (main.m:17)
18 libdyld.dylib                  0x3b640ab7 start + 2

我正在加载Paginator:

- (void)fetchLatestPlantsWithCount:(NSNumber *)count
{
    RKObjectManager *objectManager = [RKObjectManager sharedManager];

    NSString *requestString = [NSString stringWithFormat:@"/api/rest/plants/?count=%@&limit=:perPage&offset=:offset", count];

    NSDictionary *parameters = nil;
    if(_dateFilterLastModifiedAppend)
        parameters = [[NSDictionary alloc]initWithObjectsAndKeys:_dateFilterLastModifiedAppend, @"last_modified_date__gte", nil];

    RKPaginator *paginator = [objectManager paginatorWithPathPattern:requestString parameters:parameters];

    paginator.perPage = API_PER_PAGE_LIMIT;

    [ZAActivityBar showWithStatus:[NSString stringWithFormat:NSLocalizedStringFromTable(@"Downloading latest plants: %@ remaining", @"PokaLocalizable", nil), count]];

    [paginator setCompletionBlockWithSuccess:^(RKPaginator *paginator, NSArray *objects, NSUInteger page) {
        if([paginator hasNextPage])
        {
            [ZAActivityBar showWithStatus:[NSString stringWithFormat:NSLocalizedStringFromTable(@"Downloading latest plants: %@ remaining", @"PokaLocalizable", nil), [NSNumber numberWithInt:([count integerValue] - paginator.offset)]]];
            [paginator loadNextPage];
        }
        else
        {
            [self fetchLatestProductionLinesCount];
        }
    } failure:^(RKPaginator *paginator, NSError *error) {
        [self fetchLatestProductionLinesCount];
    }];

    [paginator loadPage:1];
}

最后,我向RestKit添加了一些代码以加载paginator。我不认为这是问题所在。

- (RKPaginator *)paginatorWithPathPattern:(NSString *)pathPattern parameters:(NSDictionary *)parameters
{
    NSAssert(self.paginationMapping, @"Cannot instantiate a paginator when `paginationMapping` is nil.");
    NSMutableURLRequest *request = [self requestWithMethod:@"GET" path:pathPattern parameters:parameters];
    RKPaginator *paginator = [[RKPaginator alloc] initWithRequest:request paginationMapping:self.paginationMapping responseDescriptors:self.responseDescriptors];
#ifdef _COREDATADEFINES_H
    paginator.managedObjectContext = self.managedObjectStore.mainQueueManagedObjectContext;
    paginator.managedObjectCache = self.managedObjectStore.managedObjectCache;
    paginator.fetchRequestBlocks = self.fetchRequestBlocks;
#endif
    paginator.operationQueue = self.operationQueue;
    Class HTTPOperationClass = [self requestOperationClassForRequest:request fromRegisteredClasses:self.registeredHTTPRequestOperationClasses];
    if (HTTPOperationClass) [paginator setHTTPOperationClass:HTTPOperationClass];
    return paginator;

}

唯一的区别是我传递了一些参数。

我不明白的是,我加载了其他对象, WITH 相同的代码,唯一的区别是我正在下载的对象类型。我执行这个代码之前执行几乎相同的代码 ,它完全正常。因此,我的问题是我很困惑......

更多信息:

它表示对象计数为1,该页面为1,但显然未加载?

请注意,我在同一页面内多次调用paginator。我为一种类型的对象做分页器......一旦完成,我就为另一种对象做...等等。

1 个答案:

答案 0 :(得分:1)

我之前提到的所有拉取请求已经合并到master。所以只需使用最新版本。


如果您有兴趣,我发现了一个问题并修复了它。我在RestKit github页面上发布了Pull Request

https://github.com/RestKit/RestKit/pull/2156

我建议在分支inventorum上使用我的分叉,我也选择malloc error修复:

https://github.com/bimusiek/RestKit/commits/inventorum