ios - NSOperationQueue 和传递数据

标签 ios iphone ipad cocoa

在我的应用程序中,我的主文件创建类的新实例,然后使用 NSOperationQueue 在后台运行类函数,如下所示:

NSOperationQueue backgroundQueue = [NSOperationQueue new];
MyClass mc = [MyClass alloc];
NSInvocationOperation* operation = [[NSInvocationOperation alloc] initWithTarget:mc selector:@selector(runEvents) object:nil];
[backgroundQueue addOperation:operation];

MyClass 然后在 RunEvents 中执行操作,但我很难将数据传递到 UI。我只是想更新 Storyboard 上的标签,我可以在调用 MyClass 的主类中执行此操作,但如何从 MyClass 更新它?

最佳答案

典型的答案是将您的类创建为 NSOperation 子类,并为其指定一个自定义完成 block 。如果您的目标是更新完成 block 中的 UI 或某些模型对象,请确保将该 block 分派(dispatch)回主队列:

//  CustomOperation.h

#import <Foundation/Foundation.h>

typedef void(^CustomOperationCompletion)(NSString *string);

@interface CustomOperation : NSOperation

@property (nonatomic, copy) CustomOperationCompletion customOperationCompletion;

- (id)initWithCustomCompletion:(CustomOperationCompletion)completion;

@end

//  CustomOperation.m

#import "CustomOperation.h"

@implementation CustomOperation

- (id)initWithCustomCompletion:(CustomOperationCompletion)completion {
    self = [super init];
    if (self) {
        self.customOperationCompletion = completion;
    }
    return self;
}

- (void)main {
    NSLog(@"%s starting", __FUNCTION__);

    sleep(5);

    NSString *string = [[NSDate date] description];

    if (self.customOperationCompletion) {
        [[NSOperationQueue mainQueue] addOperationWithBlock: ^{
            self.customOperationCompletion(string);
        }];
    }

    NSLog(@"%s ending", __FUNCTION__);
}
@end

然后你可以用类似的方式调用它:

NSOperationQueue *queue = [[NSOperationQueue alloc] init];

CustomOperation *operation = [[CustomOperation alloc] initWithCustomCompletion:^(NSString *string) { 
    // update the UI with the results of the operation; here I'm just going to log it

    NSLog(@"all done, string=%@", string);
}];

[queue addOperation:operation];

显然,更改您的 CustomOperationCompletion 参数以包含您想要返回的任何内容(我只是传回一个字符串)。

关于ios - NSOperationQueue 和传递数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19621334/

相关文章:

ios - 使用 CocoaPods 在 Swift 中发布通用二进制 iOS 框架

iphone - iPhone 的 webViewDidFinishLoad 会检测流式音频文件的播放结束吗

iphone - 以编程方式生成 UIButtons 并将它们与 IBAction 相关联

css - 禁用 "focus"上的 iPad 层

iphone - UINavigationBar 标题在使用自定义字体时被截断

ios - 使用 Cognito 通过 Facebook 登录后无法获取身份 ID

ios - UILocalNotification-可变复制

ios - Swift iOS Firebase - 如果 FirebaseAuth.FIRUser 对象不是 nil,它上面的 .email 怎么可能返回 nil?

iphone - 从 AppDelegate 将 NSMutableArray 添加到第二个选项卡中的 TableView

iphone - 如何将 HTML 插入 UIWebView