菜鸟教程小白 发表于 2022-12-12 15:55:24

ios - 后台位置的核心数据更新位置导致阻塞 UI


                                            <p><p>我正在使用 3 个托管对象上下文架构(为背景创建临时上下文,其父对象是 managedObjectContext - UI,并且其父 writerObjectContext 应该在后台写入数据库)并且在更新对象时遇到阻塞 UI 的问题。最好有例子。所以我的数据库中有数千个点,我使用 <code>NSFetchedResultsController</code> 和 <code>tableView</code> 来获取它们。这是我的代码:</p>

<pre><code>- (void)viewDidLoad
{
    ;

    temporaryContext = [ initWithConcurrencyType:NSPrivateQueueConcurrencyType];
    temporaryContext.parentContext = [ managedObjectContext];
    temporaryContext.undoManager = nil;

    ...
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{   
    UITableViewCell *cell = ;
    ;
    return cell;
}

- (void)configureCell:(PanelPositionCell *)cell atIndexPath:(NSIndexPath *)indexPath {
    // Fetch Record
    NSManagedObject *record = ;
    OpenPositionCD *position = (OpenPositionCD *)record;

    // Update Cell
    ;

    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), ^{
      ;
    });
}

- (void)checkAddress:(OpenPositionCD *)openPosition {
    if (openPosition.latitude == 0 &amp;&amp; openPosition.longitude == 0) {
      return;
    }

    if () {
      return;
    }

    CLLocation *location = [initWithLatitude: longitude:];
    [ getPlacemarksForLocation:location withCompletion:^(NSArray *placemarks, NSError *error) {
      if (!error) {
                openPosition.address = placemarks;
                            NSError *error = nil;
                if (!) {
                  NSLog(@&#34;Unresolved error %@, %@&#34;, error, );
                }
      }
    }];
}
</code></pre>

<p>当我滚动到没有地址的单元格时,UI 经常卡住,这取决于我滚动的速度。那么我该如何解决呢?我正在尝试使用/不使用 <code>dispatch_async</code> 和使用/不使用 <code>temporaryContext performBlock</code> 但看起来没有什么可以帮助我。非常感谢您的帮助。</p>

<p>我正在 CoreDataManager 中添加上下文初始化,但我希望没问题:</p>

<pre><code>// Returns the managed object context for the application.
// If the context doesn&#39;t already exist, it is created and bound to the persistent store coordinator for the application.
- (NSManagedObjectContext *)managedObjectContext{
    if (_managedObjectContext != nil) {
      return _managedObjectContext;
    }

    _managedObjectContext = [ initWithConcurrencyType:NSMainQueueConcurrencyType];
    _managedObjectContext.parentContext = ;

    return _managedObjectContext;
}

// Writer context for database
- (NSManagedObjectContext *)writerManagedObjectContext{
    if (_writerManagedObjectContext != nil) {
      return _writerManagedObjectContext;
    }

    NSPersistentStoreCoordinator *coordinator = ;
    if (coordinator != nil) {
      _writerManagedObjectContext = [ initWithConcurrencyType:NSPrivateQueueConcurrencyType];
      ;
    }
    return _writerManagedObjectContext;
}
</code></pre></p>
                                    <br><hr><h1><strong>Best Answer-推荐答案</ strong></h1><br>
                                            <p><p>您正在使用过时的 API。使用多个上下文的推荐方法是<strong>不</strong>将相同的持久存储协调器分配给子上下文,而是为其分配一个 <code>parentContext</code>。 </p>

<p>你可能想要 M. Zarra 的设置</p>

<pre><code>WriterContext (background)
MainContext (main thread, parent is WriterContext)
WorkerContext (background, parent is MainContext, create and destroy as needed)
</code></pre>

<p>您将在工作人员上下文中进行后台工作,然后 <code>save</code> 将更改推送到主上下文。您可以在方便的时候保存主上下文,并且只有在编写器上下文保存时才会在后台访问数据存储。</p>

<p>最后,您在不同的线程中使用了位置对象。您需要将调用包装到工作上下文的 <code>performBlock</code>block 中以安全地使用这些对象。 </p></p>
                                   
                                                <p style="font-size: 20px;">关于ios - 后台位置的核心数据更新位置导致阻塞 UI,我们在Stack Overflow上找到一个类似的问题:
                                                        <a href="https://stackoverflow.com/questions/31703719/" rel="noreferrer noopener nofollow" style="color: red;">
                                                                https://stackoverflow.com/questions/31703719/
                                                        </a>
                                                </p>
                                       
页: [1]
查看完整版本: ios - 后台位置的核心数据更新位置导致阻塞 UI