草庐IT

ios - 在 PHPhotoLibrary 中,photoLibraryDidChange 不会通知所有更新

coder 2024-01-30 原文

我正在使用 PHPhotoLibrary 为我的应用程序在 iPhone 中的相册保存和获取图像。

当我的相册有很多图片(大约 5,000 张静态图片)时, 我的应用程序从网络下载 10 张图像,然后保存到相机胶卷并添加到我的应用程序的相册。

同时,应用程序观察photoLibraryDidChange 回调以获知添加的图像,但它只通知插入的5 张图像。

我通过按主页按钮完成我的应用程序,并在照片应用程序中检查相机胶卷和我的相册。 正确的有5010张图片。

也许 photoLibraryDidChagne 没有通知所有更改?

我的代码如下。

- (void)photoLibraryDidChange:(PHChange *)changeInstance
{
    // dispatch main queue
    dispatch_async(dispatch_get_main_queue(), ^{
        [self handleChangedLibrary:changeInstance];
    });
}

- (void)handleChangedLibrary:(PHChange *)changeInstance
{
    PHFetchResultChangeDetails *fetchResultChangeDetails = [changeInstance changeDetailsForFetchResult:_assetsFetchResult];

    if (!fetchResultChangeDetails) {
        NSLog(@"### No change in fetchResultChangeDetails ###");
        return;
    }

    if (![fetchResultChangeDetails hasIncrementalChanges]) {
        [self fetchAllAssets];
        return;
    }

    NSArray *insertedObjects = [fetchResultChangeDetails insertedObjects];
    if (insertedObjects) {
        for (PHAsset *asset in insertedObjects) {
            if (asset.mediaType == PHAssetMediaTypeImage) {
                NSLog(@"asset=%@", asset);
                [_stillImageAssetArray addObject:asset];
            }
        }
    }

    self.assetsFetchResult = [PHAsset fetchAssetsInAssetCollection:_assetCollection options:nil];
}

我通过 NSLog 和调试器检查了插入的 Assets ,它确实更新了 5 张图像。

其他 5 张图片没有通知。

最佳答案

我修改了代码中的错误点,修改后确认问题没有出现。

错误点:

  1. 在某些情况下,我的代码“返回;”在回调中获取 Assets 集合之前。
  2. 我应该从 [PHAsset fetchAssetsInAssetCollection:options:]fetchResultChangeDetails.fetchResultAfterChanges 获取新结果

我引用了以下Apple的代码进行修改。

PHPhotoLibraryChangeObserver https://developer.apple.com/library/ios/documentation/Photos/Reference/PHPhotoLibraryChangeObserver_Protocol/

我的固定代码如下。谢谢。

- (void)handleChangedLibrary:(PHChange *)changeInstance
{
    // Check for changes to the list of assets (insertions, deletions, moves, or updates).
    PHFetchResultChangeDetails *fetchResultChangeDetails = [changeInstance changeDetailsForFetchResult:_assetsFetchResult];
    if (!fetchResultChangeDetails) {
        NSLog(@"### No change in fetchResultChangeDetails ###");
        return;
    }

    // Get the new fetch result for future change tracking.
    self.assetsFetchResult = fetchResultChangeDetails.fetchResultAfterChanges;

    if (![fetchResultChangeDetails hasIncrementalChanges]) {
        [self fetchAllAssets];        
        return;
    }

    NSArray *insertedObjects = [fetchResultChangeDetails insertedObjects];
    if (insertedObjects) {
        for (PHAsset *asset in insertedObjects) {
            if (asset.mediaType == PHAssetMediaTypeImage) {
                NSLog(@"asset=%@", asset);
                [_stillImageAssetArray addObject:asset];
            }
        }
    }
}

关于ios - 在 PHPhotoLibrary 中,photoLibraryDidChange 不会通知所有更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38591648/

有关ios - 在 PHPhotoLibrary 中,photoLibraryDidChange 不会通知所有更新的更多相关文章

  1. ruby-on-rails - 如何验证 update_all 是否实际在 Rails 中更新 - 2

    给定这段代码defcreate@upgrades=User.update_all(["role=?","upgraded"],:id=>params[:upgrade])redirect_toadmin_upgrades_path,:notice=>"Successfullyupgradeduser."end我如何在该操作中实际验证它们是否已保存或未重定向到适当的页面和消息? 最佳答案 在Rails3中,update_all不返回任何有意义的信息,除了已更新的记录数(这可能取决于您的DBMS是否返回该信息)。http://ar.ru

  2. ruby-on-rails - Rails 常用字符串(用于通知和错误信息等) - 2

    大约一年前,我决定确保每个包含非唯一文本的Flash通知都将从模块中的方法中获取文本。我这样做的最初原因是为了避免一遍又一遍地输入相同的字符串。如果我想更改措辞,我可以在一个地方轻松完成,而且一遍又一遍地重复同一件事而出现拼写错误的可能性也会降低。我最终得到的是这样的:moduleMessagesdefformat_error_messages(errors)errors.map{|attribute,message|"Error:#{attribute.to_s.titleize}#{message}."}enddeferror_message_could_not_find(obje

  3. ruby - 如何以所有可能的方式将字符串拆分为长度最多为 3 的连续子字符串? - 2

    我试图获取一个长度在1到10之间的字符串,并输出将字符串分解为大小为1、2或3的连续子字符串的所有可能方式。例如:输入:123456将整数分割成单个字符,然后继续查找组合。该代码将返回以下所有数组。[1,2,3,4,5,6][12,3,4,5,6][1,23,4,5,6][1,2,34,5,6][1,2,3,45,6][1,2,3,4,56][12,34,5,6][12,3,45,6][12,3,4,56][1,23,45,6][1,2,34,56][1,23,4,56][12,34,56][123,4,5,6][1,234,5,6][1,2,345,6][1,2,3,456][123

  4. ruby - Highline 询问方法不会使用同一行 - 2

    设置:狂欢ruby1.9.2高线(1.6.13)描述:我已经相当习惯在其他一些项目中使用highline,但已经有几个月没有使用它了。现在,在Ruby1.9.2上全新安装时,它似乎不允许在同一行回答提示。所以以前我会看到类似的东西:require"highline/import"ask"Whatisyourfavoritecolor?"并得到:Whatisyourfavoritecolor?|现在我看到类似的东西:Whatisyourfavoritecolor?|竖线(|)符号是我的终端光标。知道为什么会发生这种变化吗? 最佳答案

  5. ruby-on-rails - 项目升级后 Pow 不会更改 ruby​​ 版本 - 2

    我在我的Rails项目中使用Pow和powifygem。现在我尝试升级我的ruby​​版本(从1.9.3到2.0.0,我使用RVM)当我切换ruby​​版本、安装所有gem依赖项时,我通过运行railss并访问localhost:3000确保该应用程序正常运行以前,我通过使用pow访问http://my_app.dev来浏览我的应用程序。升级后,由于错误Bundler::RubyVersionMismatch:YourRubyversionis1.9.3,butyourGemfilespecified2.0.0,此url不起作用我尝试过的:重新创建pow应用程序重启pow服务器更新战俘

  6. ruby-on-rails - 使用 rails 4 设计而不更新用户 - 2

    我将应用程序升级到Rails4,一切正常。我可以登录并转到我的编辑页面。也更新了观点。使用标准View时,用户会更新。但是当我添加例如字段:name时,它​​不会在表单中更新。使用devise3.1.1和gem'protected_attributes'我需要在设备或数据库上运行某种更新命令吗?我也搜索过这个地方,找到了许多不同的解决方案,但没有一个会更新我的用户字段。我没有添加任何自定义字段。 最佳答案 如果您想允许额外的参数,您可以在ApplicationController中使用beforefilter,因为Rails4将参数

  7. ruby-on-rails - 跳过状态机方法的所有验证 - 2

    当我的预订模型通过rake任务在状态机上转换时,我试图找出如何跳过对ActiveRecord对象的特定实例的验证。我想在reservation.close时跳过所有验证!叫做。希望调用reservation.close!(:validate=>false)之类的东西。仅供引用,我们正在使用https://github.com/pluginaweek/state_machine用于状态机。这是我的预订模型的示例。classReservation["requested","negotiating","approved"])}state_machine:initial=>'requested

  8. ruby - Nokogiri 剥离所有属性 - 2

    我有这个html标记:我想得到这个:我如何使用Nokogiri做到这一点? 最佳答案 require'nokogiri'doc=Nokogiri::HTML('')您可以通过xpath删除所有属性:doc.xpath('//@*').remove或者,如果您需要做一些更复杂的事情,有时使用以下方法遍历所有元素会更容易:doc.traversedo|node|node.keys.eachdo|attribute|node.deleteattributeendend 关于ruby-Nokog

  9. ruby - 如何验证 IO.copy_stream 是否成功 - 2

    这里有一个很好的答案解释了如何在Ruby中下载文件而不将其加载到内存中:https://stackoverflow.com/a/29743394/4852737require'open-uri'download=open('http://example.com/image.png')IO.copy_stream(download,'~/image.png')我如何验证下载文件的IO.copy_stream调用是否真的成功——这意味着下载的文件与我打算下载的文件完全相同,而不是下载一半的损坏文件?documentation说IO.copy_stream返回它复制的字节数,但是当我还没有下

  10. ruby - 获取模块中定义的所有常量的值 - 2

    我想获取模块中定义的所有常量的值:moduleLettersA='apple'.freezeB='boy'.freezeendconstants给了我常量的名字:Letters.constants(false)#=>[:A,:B]如何获取它们的值的数组,即["apple","boy"]? 最佳答案 为了做到这一点,请使用mapLetters.constants(false).map&Letters.method(:const_get)这将返回["a","b"]第二种方式:Letters.constants(false).map{|c

随机推荐