首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >NSOperation userInfo字典

NSOperation userInfo字典
EN

Stack Overflow用户
提问于 2013-04-27 18:56:11
回答 2查看 790关注 0票数 2

有没有一种方法可以让NSOperationuserInfo NSDictionary

基本上,我想给NSOperation分配一个ID,稍后我想检查一下,这个ID是否已经分配给了NSOperation

代码语言:javascript
复制
- (void)processSmthForID:(NSString *)someID {

    for (NSOperation * operation in self.precessQueue.operations) {

        if ([operation.userInfo[@"id"] isEqualToString:someID]) {
            // already doing this for this ID, no need to create another operation
            return;
        }

    }

    NSOperation * newOperation = ...
    newOperation.userInfo[@"id"] = someID;

    // enqueue and execute

}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-04-27 19:13:06

NSOperation应该是子类化的。只需设计自己的子类即可。

NSOperation类是一个抽象类,用于封装与单个任务关联的代码和数据。因为它是抽象的,所以不直接使用这个类,而是子类化或使用系统定义的子类(NSInvocationOperation或NSBlockOperation)来执行实际任务。

read here

我同意@Daij-Djan关于添加userInfo属性的观点。

这个属性可以作为NSOperation上的一个扩展来实现(请参考他对实现的回答)。

然而,对于NSOperation的标识符的需要是类的专门化(您可以说新类是IdentifiableOperation)

票数 6
EN

Stack Overflow用户

发布于 2013-04-27 19:49:42

在NSOperation上定义属性,如下所示:

代码语言:javascript
复制
#import <Foundation/Foundation.h>
#import <objc/runtime.h>

//category
@interface NSOperation (UserInfo)
@property(copy) NSDictionary *userInfo;
@end

static void * const kDDAssociatedStorageUserInfo = (void*)&kDDAssociatedStorageUserInfo;

@implementation NSOperation (UserInfo)

- (void)setUserInfo:(NSDictionary *)userInfo {
    objc_setAssociatedObject(self, kDDAssociatedStorageUserInfo, [userInfo copy], OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}

- (NSDictionary *)userInfo {
    return objc_getAssociatedObject(self, kDDAssociatedStorageUserInfo);
}

@end

这会让你在任何NSOperation或它的子类上得到一个userInfo ...例如NSBlockOperation或AFHTTPRequestOperation

演示:

代码语言:javascript
复制
    //AFNetwork test
    AFHTTPRequestOperation *operation = [[AFHTTPRequestOperation alloc] initWithRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:@"http://www.google.de"]]];
    operation.userInfo = @{@"url":operation.request.URL};
    [operation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) {
        NSLog(@"download of %@ completed. userinfo is %@", operation.request.URL, operation.userInfo);
        if(queue.operationCount==0)
            exit(1);
    } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
        NSLog(@"download of %@ failed. userinfo is %@", operation.request.URL, operation.userInfo);
        if(queue.operationCount==0)
            exit(1);
    }];
    [queue addOperation:operation];
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16251257

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档