UI 图像选择器混淆

Posted

技术标签:

【中文标题】UI 图像选择器混淆【英文标题】:UI Image picker confusion 【发布时间】:2020-07-06 14:37:01 【问题描述】:

我正在我的 Xamarin 应用程序中实现 UI 图像选择器,但被代码中使用的 void 函数难住了。我指的函数叫做 OnImagePickerFinishedPickingMedia()

[assembly: Dependency(typeof(PhotoPickerService))]
namespace PhotoPickerImplementation.ios

    public class PhotoPickerService : IPhotoPickerService
    
        TaskCompletionSource<Stream> taskCompletionSource;
        UIImagePickerController imagePicker;

        public Task<Stream> GetImageStreamAsync()
        
            //Create and define UIImagePickerController
            imagePicker = new UIImagePickerController
            
                SourceType = UIImagePickerControllerSourceType.PhotoLibrary,
                MediaTypes = UIImagePickerController.AvailableMediaTypes(UIImagePickerControllerSourceType.PhotoLibrary)
            ;

            //Set Event Handlers
            imagePicker.FinishedPickingMedia += OnImagePickerFinishedPickingMedia;
            imagePicker.Canceled += OnImagePickerCancelled;

            //Present UIImagePickerController
            UIWindow window = UIApplication.SharedApplication.KeyWindow;
            var viewController = window.RootViewController;
            viewController.PresentViewController(imagePicker, true, null);

            //Return Task Object
            taskCompletionSource = new TaskCompletionSource<Stream>();
            return taskCompletionSource.Task;
        

        void OnImagePickerFinishedPickingMedia(object sender, UIImagePickerMediaPickedEventArgs args)
        
            //assigns var image to the edited image if there is one, otherwise it'll assign it to the original image
            UIImage image = args.EditedImage ?? args.OriginalImage;

            if (image != null)
            
                //Convert UIImage to .NET stream object
                NSData data;
                if(args.ReferenceUrl.PathExtension.Equals("PNG") || args.ReferenceUrl.PathExtension.Equals("png"))
                
                    data = image.AsPNG();
                    //Console.WriteLine(data);
                

                else
                
                    data = image.AsJPEG(1);
                

                Stream stream = data.AsStream();

                UnregisterEventHandlers();
                taskCompletionSource.SetResult(stream);
            

            else
            
                UnregisterEventHandlers();
                taskCompletionSource.SetResult(null);
            

            imagePicker.DismissModalViewController(true);
        



        void OnImagePickerCancelled(object sender, EventArgs args)
        
            UnregisterEventHandlers();
            taskCompletionSource.SetResult(null);
            imagePicker.DismissModalViewController(true);
        

        void UnregisterEventHandlers()
        
            imagePicker.FinishedPickingMedia -= OnImagePickerFinishedPickingMedia;
            imagePicker.Canceled -= OnImagePickerCancelled;
        
    

文档使用此功能,我正在尝试理解它。为什么函数 OnImagePickerFinishedPickingMedia 使用局部变量 data 和 stream?由于它是一个 void 函数,因此变量保持在函数的本地,并且永远不会在函数之外返回(或者至少我没有看到它们被返回)。

我错过了什么吗?这些变量为图像选择器增加了什么价值,它们的用途可能是什么?

【问题讨论】:

stream 分配给TaskCompletionSource,以便调用函数可以访问它 @Jason 但 stream 的值从未返回,因为它是一个 void 函数,所以我对调用函数如何访问该值感到困惑 GetImageStreamAsync 返回一个任务,并且流被附加到该任务 @Jason 休息后回来,我重读了您的第一个回复。我想我误解了 TaskCompletionSource taskCompletionSource 在我的代码中的含义。你能帮我分解一下,还是顺便给我指出一个资源?我认为我对任务以及 taskCompletionSource 是什么存在知识差距 这基本上是一种将传统异步操作转变为与 async/await 一起工作的模式。你用 await 调用异步方法 A,它返回一个 Task。然后,当 A 的完成处理程序触发时,它将其结果分配给 A 已经返回的任务。然后任务完成,原始调用者可以继续处理结果。 【参考方案1】:

如果您查看代码,它使用data“创建”stream (Stream stream = data.AsStream();),然后将 stream 设置为 taskCompletionSource 的结果,这实际上在函数 @ 之外987654327@ 这个taskCompletionSource 最终被GetImageStreamAsync 使用,返回一个Task,(return taskCompletionSource.Task;)

【讨论】:

现在这更有意义了。我认为我对任务完成源的真正含义存在知识差距。你能分解一下这意味着什么:TaskCompletionSource taskCompletionSource。这是一个功能吗?这到底是什么? TaskCompletionSource 是一个与Task 类相关的类,它允许你运行异步操作(不在主线程中)。 Task 可以返回一个值,也可以只是“做一些需要时间的事情”,因此有必要在辅助线程中执行它们。老实说,我一直直接使用Task 类,所以我无法为您提供有关TaskCompletionSource 类的更多信息,但根据我在文档中看到的(docs.microsoft.com/en-us/dotnet/api/…),它似乎允许您以不同的方式

以上是关于UI 图像选择器混淆的主要内容,如果未能解决你的问题,请参考以下文章

UI 图像选择器在 ios 7/iphone 4s 上崩溃

禁用 jQuery UI 日期选择器的焦点设置

同一个视图控制器Objective C中的两个UI选择器?

Flutter Appstore 拒绝包含混淆代码或选择器修改

没有已知的选择器混淆类方法

jquery 选择器混淆 - $('div p') vs $('div>p')