1

我目前正在使用最新版本的 Google Analytics (v2.0)

我在我的 appDelegate 中以最常见的方式实例化它:

[GAI sharedInstance].trackUncaughtExceptions = NO;
[GAI sharedInstance].dispatchInterval = 0;
[[GAI sharedInstance] trackerWithTrackingId:@"..."];

但是当我运行应用程序时,它会在日志中不断产生这个异常:

An observer of NSManagedObjectContextDidSaveNotification illegally threw an exception.  Objects saved = {
    deleted = "{(\n    <GAIHit: 0xc1cac50> (entity: GAIHit; id: 0xc160740 <x-coredata://8854889C-BE6C-49BB-BBA9-99465B86265E/GAIHit/p26> ; data: {\n    dispatchUrl = \"https://ssl.google-analytics.com/collect\";\n    gaiVersion = \"2.0b4\";\n    parametersData = <62706c69 73743030 d4010203 04050852 53542474 6f705824 6f626a65 63747358 24766572 73696f6e 59246172 63686976 6572>;\n    timestamp = \"2013-07-10 10:21:55 +0000\";\n})\n)}";
    inserted = "{(\n)}";
    updated = "{(\n)}";
} and exception = Object's persistent store is not reachable from this NSManagedObjectContext's coordinator with userInfo = (null)

它不会使应用程序崩溃,但它非常冗长并污染了我的日志。

此外,它似乎有效,因为 GA 日志说:

-[GAIDispatcher dispatchComplete:withStartTime:withRetryNumber:withResponse:withData:withError:] (GAIDispatcher.m:415) DEBUG: Successfully dispatched hit /GAIHit/p51 (0 retries).

任何想法停止这些日志?

4

2 回答 2

4

来自 GAM 文档:

如果您的应用程序使用 CoreData 框架:响应来自 Google Analytics CoreData 对象的通知,例如 NSManagedObjectContextDidSaveNotification,可能会导致异常。相反,Apple 建议通过将托管对象上下文指定为侦听器的参数来过滤 CoreData 通知。从 Apple 了解更多信息。

我想这是你的情况

于 2013-07-10T10:52:45.560 回答
0

您应该只合并来自托管对象上下文的更改,而不是来自第三方库创建的任何其他上下文的更改。

但是,按上下文过滤意味着将所有背景上下文的列表存储在某处。我找到了更简单的解决方案:与其将上下文与您的上下文列表进行比较,只需检查上下文是否是为您的 PersistentStoreCoordinator 创建的就足够了:

- (void) managedObjectContextDidSaveNotification: (NSNotification *) notification {
    NSManagedObjectContext * context = notification.object;
    if (context != self.managedObjectContextForMainThread) {
        if (context.persistentStoreCoordinator == self.persistentStoreCoordinator) {
            [context mergeChangesFromContextDidSaveNotification:notification];
        }
    }
}
于 2015-01-02T09:30:35.267 回答