abisson
abisson

Reputation: 4425

RestKit Paginator Crash: Cannot determine hasNextPage: paginator is not loaded

For some reason, I randomly sometimes get this crash.

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

I am loading the Paginator like this:

- (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];
}

Finally, I added some code to RestKit in order to load the paginator. I don't think it is the problem though.

- (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;

}

The only difference is that I pass some parameters to it.

The thing I don't understand is that I load other objects, WITH that same code with the only difference being the type of objects I am downloading. I execute almost that same code right before executing this one, and it works perfectly fine. Hence, my question as to I am confused...

Some more information:

It says the object count is 1, that page is 1, but apparently it is not loaded?

Note that I call the paginator multiple times within the same page. I do the paginator for one type of objects... once it is done I do it for another one... and so on.

Upvotes: 1

Views: 247

Answers (1)

Michał Hernas
Michał Hernas

Reputation: 416

All pull requests that I mentioned before were merged already to master. So just use the newest version.


I found an issue and fixed it if you are interested. I posted Pull Request on RestKit github page

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

I would recommend to use my fork on branch inventorum where I also cherry picked malloc error fix:

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

Upvotes: 1

Related Questions