Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/41.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone iOS应用程序体系结构与NSO操作_Iphone_Objective C_Architecture_Nsoperation_Nsoperationqueue - Fatal编程技术网

Iphone iOS应用程序体系结构与NSO操作

Iphone iOS应用程序体系结构与NSO操作,iphone,objective-c,architecture,nsoperation,nsoperationqueue,Iphone,Objective C,Architecture,Nsoperation,Nsoperationqueue,两个月前,我开始编写一个新的iPhone应用程序,为此我创建了一个通用的RESTFul web服务,它允许我拥有许多必要的功能,如用户身份验证、用户配置文件、友谊系统、媒体处理、消息传递系统等。在我看来,有几个用例可以在未来的iPhone应用程序中重用此Web服务 基于这种想法,我决定为这个应用程序(以及所有未来的应用程序)编写一个静态库,处理所有繁重的工作,如媒体(图像、视频、声音)设置和处理、与web服务通信、结果解析和映射、处理核心数据等等 考虑到我的应用程序,有很多并行任务正在运行的场景

两个月前,我开始编写一个新的iPhone应用程序,为此我创建了一个通用的RESTFul web服务,它允许我拥有许多必要的功能,如用户身份验证、用户配置文件、友谊系统、媒体处理、消息传递系统等。在我看来,有几个用例可以在未来的iPhone应用程序中重用此Web服务

基于这种想法,我决定为这个应用程序(以及所有未来的应用程序)编写一个静态库,处理所有繁重的工作,如媒体(图像、视频、声音)设置和处理、与web服务通信、结果解析和映射、处理核心数据等等

考虑到我的应用程序,有很多并行任务正在运行的场景(最坏的情况),例如。 用户当前更改其个人资料图片,同时应用程序将用户位置发送到服务器(在后台),并接收新的推送通知

因此决定将每个逻辑操作(如SendUserLocation或GetCurrentFriendList)封装在NSOperation中,并将它们添加到serviceQueue(NSOperationQueue)中

当操作成功地从webservice获得结果时,每个操作都能够生成子任务,并且现在应该对其进行处理

典型的ServiceManager方法如下所示

- (void)activateFriendsSync:(id)observer onSuccess:(SEL)selector {
    ELOSyncFriends *opSyncFriends  = [[ELOSyncFriends alloc] initWithSM:self];
    [self ELServiceLogger:opSyncFriends];
    [serviceQueue addOperation:opSyncFriends];
    if(observer) {
        [self registerObserver:observer selector:selector name:opSyncFriends.notificationName]; 
    }
}
每个操作、请求(到服务器)和子任务都使用GUID作为通知名,在父对象完成处理时通知父对象。如果操作中的所有操作都已完成,则会将通知发送回用户界面

也就是说,添加和删除子任务的代码如下所示

- (void)removeSubTask:(NSNotification*)notification {
    ELRequest *request = (ELRequest*)[notification object];
    [subTasks removeObjectIdenticalTo:request.notificationName];
    if([subTasks count] == 0) {
         // all SubTaks done, send notification to parent
        [serviceManager.notificationCenter postNotificationName:self.notificationName object:request];
    }
}

- (NSString*)addSubTask {
    NSString* newName = [self GetUUID];
    [subTasks addObject:[newName retain]];
    [serviceManager.notificationCenter addObserver:self selector:@selector(removeSubTask:) name:newName object:nil];
    return newName;
} 

- (NSString *)GetUUID {
    CFUUIDRef theUUID = CFUUIDCreate(NULL);
    CFStringRef string = CFUUIDCreateString(NULL, theUUID);
    CFRelease(theUUID);
    return [(NSString *)string autorelease];
}
[self.core.serviceManager activateFriendsSync:self onSuccess:@selector(myMethod:)];
现在我要做的就是在gui中调用serviceManager来启动一个特定的操作,如

[self.core.serviceManager activateFriendsSync:nil onSuccess:nil];
如果我想注册一个观察者,我只需传递一个观察者对象和一个选择器,如下所示

- (void)removeSubTask:(NSNotification*)notification {
    ELRequest *request = (ELRequest*)[notification object];
    [subTasks removeObjectIdenticalTo:request.notificationName];
    if([subTasks count] == 0) {
         // all SubTaks done, send notification to parent
        [serviceManager.notificationCenter postNotificationName:self.notificationName object:request];
    }
}

- (NSString*)addSubTask {
    NSString* newName = [self GetUUID];
    [subTasks addObject:[newName retain]];
    [serviceManager.notificationCenter addObserver:self selector:@selector(removeSubTask:) name:newName object:nil];
    return newName;
} 

- (NSString *)GetUUID {
    CFUUIDRef theUUID = CFUUIDCreate(NULL);
    CFStringRef string = CFUUIDCreateString(NULL, theUUID);
    CFRelease(theUUID);
    return [(NSString *)string autorelease];
}
[self.core.serviceManager activateFriendsSync:self onSuccess:@selector(myMethod:)];
最后但并非最不重要的一点是,我的问题是:“体系结构”运行良好且稳定,但值得一试吗?它是否会产生过多的开销?这有意义吗?您个人如何实现并发操作

最好的 亨里克

请随意编辑我的问题,提出问题(作为评论),为我的想法点名


我真的很难解释,基本上是因为我不是以英语为母语的人。别误会我。我写这篇帖子并不是为了炫耀。我想做的就是学习(也许还要写一个更高级的iphone/objective c问题)

你刚才描述了一个非常类似的架构,我在我的一些应用程序中使用了这个架构:)

我让我的服务管理层立即返回一组对象,然后在一段时间后返回一组更新的对象,即

NSArray *stuff = [serviceManager getFriendsForUser:@"Bob"];
然后,在服务器响应后,会收到一个NSNotification,其中包含一个更新的列表(在本例中是Bob的朋友)

除了这个微小的改变,你的架构是一样的


要把它全部设置好,需要做很多工作,但我认为从长远来看,这是值得的,因为修复bug/扩展代码要容易得多。

是的,如果它被外包给服务请求,并且你有很多调用要打,那么这样的库(imo)就不会太过,我也写过类似的东西。这种结构使我很容易管理一个复杂的系统,任务非常复杂多样

我所做的主要设计差异是没有将NSNotification与服务管理器一起使用。相反,我倾向于使用协议/类型进行回调(该操作持有对它的引用)。通知很重。在这种情况下,操作不保留侦听器/通知对象,但侦听器保留操作。如果关系为1-1,则允许取消

另一个主要考虑因素是尽早定义线程。允许客户端定义希望在哪个线程上接收响应。原因是,如果通知/侦听器必须更新UI(例如,您正在使用UIKit或AppKit),则回调通常会有一个约束或逻辑条目。因此,创建者可以对操作说“您必须从主线程通知我”,或者“我可以处理来自任何线程的响应”。这将大大减少控制器/侦听器/观察者代码和出错的机会。

对于“子操作”:如果父操作是其每个子操作的依赖项(参见
-[NSOperation addDependency:
),那么将它们放在队列中如何?NSOperationQueue可以为您排序整个操作堆。我认为这是简单和自然的工作