但是,当你必须将它们中的几个字符串串起来时,它会很快地变得凌乱
例如,您必须连续调用4个URL:
[remoteapiWithURL:url1 success:^(int status){ [remoteapiWithURL:url2 success:^(int status){ [remoteapiWithURL:url3 success:^(int status){ [remoteapiWithURL:url2 success:^(int status){ //succes!!! }]; }]; }];}];
所以对于每一次迭代,我深入一层,甚至我甚至不处理嵌套块中的错误.
当有一个实际循环时,它变得更糟.比方说,我想上传一个100块的文件:
- (voID) continueUploaDWithBlockNr:(int)blockNr{ if(blocknr>=100) { //success!!! } [remoteapiUploadfile:file withBlockNr:blockNr success:^(int status) { [self continueUploaDWithBlockNr:blockNr]; }];}
这感觉非常不直观,非常不可读得非常快.
在.Net中,他们使用async和await关键字解决了所有这些,基本上将这些延续展开为一个看似同步的流程.
Objective C的最佳实践是什么?
解决方法 你的问题立即让我想起递归.原来,Objective-c blocks can be used in recursion.所以我想出了以下解决方案,这是很容易理解,可以扩展到N任务相当不错.// __block declaration of the block makes it possible to call the block from within itself__block voID (^urlFetchBlock)();// Neatly aggregate all the urls you wish to fetchNSArray *urlArray = @[ [NSURL URLWithString:@"http://www.Google.com"],[NSURL URLWithString:@"http://www.stackoverflow.com"],[NSURL URLWithString:@"http://www.bing.com"],[NSURL URLWithString:@"http://www.apple.com"]];__block int urlindex = 0;// the 'recursive' block urlFetchBlock = [^voID () { if (urlindex < (int)[urlArray count]){ [self remoteapiWithURL:[urlArray objectAtIndex:index] success:^(int theStatus){ urlindex++; urlFetchBlock(); } failure:^(){ // handle error. }]; }} copy];// initiate the url requestsurlFetchBlock();总结
以上是内存溢出为你收集整理的如何使用Objective-C中的块进行结构化编程全部内容,希望文章能够帮你解决如何使用Objective-C中的块进行结构化编程所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)