当另一个类完成处理所需数据时如何中断 Viewcontroller

Posted

技术标签:

【中文标题】当另一个类完成处理所需数据时如何中断 Viewcontroller【英文标题】:How to interrupt a Viewcontroller when another class is finished processing required data 【发布时间】:2017-05-25 19:48:24 【问题描述】:

我有两个类,一个视图控制器和另一个执行异步进程的 NSObject 类,一旦完成,我想中断视图控制器,类似于按钮作为 IBAction 所做的操作,以更新 UI。我想保持这个功能模块化,以便在以后的阶段更好地使用。有没有办法在 Objective-c 上做到这一点?

CircleDetectionViewController.h:

#import <UIKit/UIKit.h>
#import "CameraController.h"



@interface CircleDetectionViewController : UIViewController <MyDelegate>
@property (weak, nonatomic) IBOutlet UIImageView *screenPreview;

@end

CircleViewController.mm:

@interface CircleDetectionViewController () <CvVideoCameraDelegate>

@end

@implementation CircleDetectionViewController
CvVideoCamera *camera;
//code
@end

CameraController.h:

#import <Foundation/Foundation.h>
#import <AVFoundation/AVFoundation.h>
#import "CircleDetectionViewController.h"

@protocol MyDelegate <NSObject>

-(void) updateUI;
@end

@interface CameraController : NSObject <MyDelegate>
@property (nonatomic, strong) AVCaptureDevice *inputDevice;
@property (nonatomic, strong) AVCaptureSession *session;
@property (nonatomic, strong) AVCaptureStillImageOutput *photoOutput;
@property (nonatomic, weak) id <MyDelegate> delegate;
@end

CameraController.m:

#import "CameraController.h"
#import "FlashHelper.h"
#import "ImageProcessor.h"

@implementation CameraController
@synthesize delegate;
FlashHelper *Flash;
ImageProcessor *IMGProcessor;
int shootCounter;
int NUMSHOTS = 2;

-(id)init
//code 

由于某种原因,代码显示“没有名为 MyDelegate 的类型或协议” 任何帮助将不胜感激!

【问题讨论】:

使用委托或回调/完成块。这应该是您在理解它们后可以轻松使用谷歌搜索和使用的术语。 代表模式的最佳时机! developer.apple.com/library/content/documentation/General/… 我的视图控制器已经有一个用于 openCV 的委托,我还能使用我自己的自定义委托吗? 【参考方案1】:

在 NSObject 类中创建一个委托:

@protocol MyDelegate <NSObject>

-(void) updateUI;
@end

并声明委托的属性

@property (nonatomic, weak) id <MyDelegate> delegate;

在 viewcontroller 类中调用委托类

NSObject 类obj.delegate = self; 并实现委托方法。

始终从主线程更新您的 UI。

要获取主线程,请使用:

dispatch_async(dispatch_get_main_queue(), ^
   // call your delegate method or update UI here
);

有关委托方法的详细信息,请查看this。

【讨论】:

我的委托问题是我的视图控制器已经有一个委托在使用 openCV 相机一个,有没有办法使用两个委托? 您可以在一个视图控制器中调用多个委托,例如 UIViewController 。另外,你可以使用 NSNotificationCenter 来达到同样的目的。

以上是关于当另一个类完成处理所需数据时如何中断 Viewcontroller的主要内容,如果未能解决你的问题,请参考以下文章

当另一个孩子完成时如何退出一个子进程

当另一个完成时执行一个 Ajax 请求

当另一个任务完成时Linux计划任务

当另一个表单关闭时,如何设置一个表单的标题(C#)

当另一个文本框在报告中增加其大小时如何停止增加文本框的大小

当另一个片段中的数据发生更改时,如何刷新一个片段中的 RecyclerView