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如果您查看代码,它使用data
“创建”stream
(Stream stream = data.AsStream();
),然后将 stream
设置为 taskCompletionSource
的结果,这实际上在函数 @ 之外987654327@ 这个taskCompletionSource
最终被GetImageStreamAsync
使用,返回一个Task
,(return taskCompletionSource.Task;
)
【讨论】:
现在这更有意义了。我认为我对任务完成源的真正含义存在知识差距。你能分解一下这意味着什么:TaskCompletionSourceTaskCompletionSource
是一个与Task
类相关的类,它允许你运行异步操作(不在主线程中)。 Task
可以返回一个值,也可以只是“做一些需要时间的事情”,因此有必要在辅助线程中执行它们。老实说,我一直直接使用Task
类,所以我无法为您提供有关TaskCompletionSource
类的更多信息,但根据我在文档中看到的(docs.microsoft.com/en-us/dotnet/api/…),它似乎允许您以不同的方式以上是关于UI 图像选择器混淆的主要内容,如果未能解决你的问题,请参考以下文章