菜鸟教程小白 发表于 2022-12-13 02:49:55

ios - 用相机胶卷图像填充 tableview


                                            <p><p>我正在尝试在 tableview 中填充相机胶卷中的图像。</p>

<p>在<code>ViewDidLoad</code>中,我创建了一个 Assets 组。</p>

<pre><code>- (void)viewDidLoad
{
;
self.tableView.delegate = self;
self.tableView.dataSource = self;

self.assetsLibrary = [ init];
[self.assetsLibrary enumerateGroupsWithTypes:ALAssetsGroupSavedPhotos usingBlock:^(ALAssetsGroup *group, BOOL *stop) {
    if(nil!=group){
      ];
      self.assetGroup = group;
      NSLog(@&#34;%d images found&#34;, self.assetGroup.numberOfAssets);
    }
} failureBlock:^(NSError *error) {
    NSLog(@&#34;block fucked!&#34;);
}];
;

}
</code></pre>

<p>在 <code>CellForRowAtIndexPath</code> 中,我使用 GCD 后台队列在相应索引处使用图像填充单元格。</p>

<pre><code> static NSString *CellIdentifier = @&#34;Cell&#34;;

    dispatch_queue_t imgLoadQueue = dispatch_queue_create(&#34;Thumb loader&#34;, NULL);
UITableViewCell *cell = ;
if (cell == nil) {
    cell = [ initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
    cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;

}

dispatch_async(imgLoadQueue, ^{
    options:0 usingBlock:^(ALAsset *result, NSUInteger index, BOOL *stop) {
      if (nil != result) {
            ALAssetRepresentation *repr = ;
            UIImage *img = ];
            cell.imageView.image = img;

      }
    }];

});


return cell;
</code></pre>

<p>问题是,初始单元格是空的。仅在我开始滚动后才开始加载图像。而且,一旦我滚动,应用程序就会崩溃。我对 GCD 很陌生,似乎没有正确使用它。感谢您对此事的任何帮助。</p></p>
                                    <br><hr><h1><strong>Best Answer-推荐答案</ strong></h1><br>
                                            <p><p>您需要在 <code>viewDidLoad</code> 中的枚举 block 完成并填充 <code>self.assetGroup</code> 后调用 <code></code>。枚举 block 是异步执行的,因此在 block 完成之前调用 reloadData 并且在 TableView 委托(delegate)回调上您的assetGroup 不包含任何数据。当您开始滚动时,该属性已填充并且您开始看到图像。</p>

<p>我还没有看到解释如何检测枚举 block 结束的苹果文档,但是这两个接受的答案表明当枚举结束时组值将为零。 </p>

<p> <a href="https://stackoverflow.com/questions/3195657/iphone-enumerategroupswithtypes-finishing-selector" rel="noreferrer noopener nofollow">iPhone enumerateGroupsWithTypes finishing selector</a>
<a href="https://stackoverflow.com/questions/8474887/find-out-when-my-asynchronous-call-is-finished" rel="noreferrer noopener nofollow">Find out when my asynchronous call is finished</a> </p>

<p>所以在你的组枚举 block 中添加一个 else 条件 - </p>

<pre><code> if(nil!=group){
    ];
    self.assetGroup = group;
    NSLog(@&#34;%d images found&#34;, self.assetGroup.numberOfAssets);
}
else
    ;
</code></pre>

<p>删除枚举 block 后调用的reloadData。</p>

<p>尝试将 CellForRowAtIndexPath 中的枚举 block 从 GCD 队列中取出。该 block 也将异步执行。无需将其分派(dispatch)到后台队列。</p></p>
                                   
                                                <p style="font-size: 20px;">关于ios - 用相机胶卷图像填充 tableview,我们在Stack Overflow上找到一个类似的问题:
                                                        <a href="https://stackoverflow.com/questions/16873370/" rel="noreferrer noopener nofollow" style="color: red;">
                                                                https://stackoverflow.com/questions/16873370/
                                                        </a>
                                                </p>
                                       
页: [1]
查看完整版本: ios - 用相机胶卷图像填充 tableview