请解释Objective-C中模块的用途

请解释Objective-C中模块的用途,objective-c,objective-c-blocks,block,Objective C,Objective C Blocks,Block,我最近一直试图理解块在编程中的重要性(特别是Objective-C)。很明显,它们在iOS/Cocoa API中被大量使用,所以我试图理解它们 大多数情况下,我仍然不明白为什么要使用块而不是仅仅创建一个单独的辅助函数。例如,如果我创建了一个实现某种排序功能的块,那么将该函数创建为一个helper类的方法,这样代码中的所有对象都可以更容易地使用它,不是更容易吗?块的一个很好的特性是,它们可以在任何可以使用对象的地方使用,因此您可以将块存储在数组或字典中。另一件有趣的事情是,您可以在对象内或对象之间

我最近一直试图理解块在编程中的重要性(特别是Objective-C)。很明显,它们在iOS/Cocoa API中被大量使用,所以我试图理解它们


大多数情况下,我仍然不明白为什么要使用块而不是仅仅创建一个单独的辅助函数。例如,如果我创建了一个实现某种排序功能的块,那么将该函数创建为一个helper类的方法,这样代码中的所有对象都可以更容易地使用它,不是更容易吗?

块的一个很好的特性是,它们可以在任何可以使用对象的地方使用,因此您可以将块存储在数组或字典中。另一件有趣的事情是,您可以在对象内或对象之间传递块作为方法参数,例如:

- (void)processDataWithBlock:(void (^)(void))block
+ (void)animateWithDuration:(NSTimeInterval)duration animations:(void (^)(void))animations
第二种方法甚至是
UIView
API。有人可能会说函数指针在这里就可以了,但那会更复杂,更不灵活,更不连贯。此外,块可以访问局部变量和实例变量,而无需将它们作为参数传递


从blocks用户的角度来看,这是我的2美分,但我不是专家……

blocks的一个很好的特性是,它们可以在任何可以使用对象的地方使用,因此您可以将块存储在数组或字典中。另一件有趣的事情是,您可以在对象内或对象之间传递块作为方法参数,例如:

- (void)processDataWithBlock:(void (^)(void))block
+ (void)animateWithDuration:(NSTimeInterval)duration animations:(void (^)(void))animations
第二种方法甚至是
UIView
API。有人可能会说函数指针在这里就可以了,但那会更复杂,更不灵活,更不连贯。此外,块可以访问局部变量和实例变量,而无需将它们作为参数传递


从blocks用户的角度来看,这是我的2美分,但我不是一个专家……

blocks是回调或委托的一个很好的替代品,如果仅仅是为了提高代码可读性,让您的业务逻辑保持在调用代码的本地

但它们更重要:对于异步性非常有用,如果您想使用它们来提高性能,它们是必不可少的


除了苹果公司的官方文档之外,我可以强烈推荐阅读Mike Ash的《优秀》一书。

块是回调或委托的一个很好的替代品,如果仅仅是为了通过保持调用代码的本地业务逻辑来提高代码的可读性的话

但它们更重要:对于异步性非常有用,如果您想使用它们来提高性能,它们是必不可少的


除了苹果公司的官方文档,我可以强烈推荐阅读Mike Ash的《卓越》杂志。

如果您的排序功能是一次性的,而其他地方没有使用,该怎么办?通过使用块,您将最小化代码的表面积并增加代码的局部性。如果您的排序函数是一次性的,而其他地方没有使用,该怎么办?您可能会通过使用块来最小化代码的表面积并增加代码的局部性。我认为“让业务逻辑保持在调用代码的局部性”的想法是我被绊倒的地方。如果需要重用业务逻辑,该怎么办?块不会阻止您将可重用代码重构给公共或私人助手,但它们可以以互补的方式帮助提高代码的简洁性和重用性。假设您将一些包含异步操作的可重用代码重构为myNewHelperMethod:(id)obj。现在假设您希望您的调用对象在助手完成后执行一些操作。您可以使用委派或NSNotifications,但两者都非常重要,并且会使控制流变得混乱。相反,您可以让助手从调用者那里接收一个块:
mynewHelperMethod:(id)obj with completionblock:^(id obj)aBlock
我认为“将业务逻辑保持在调用代码的本地”的想法是我被绊倒的地方。如果需要重用业务逻辑,该怎么办?块不会阻止您将可重用代码重构给公共或私人助手,但它们可以以互补的方式帮助提高代码的简洁性和重用性。假设您将一些包含异步操作的可重用代码重构为myNewHelperMethod:(id)obj。现在假设您希望您的调用对象在助手完成后执行一些操作。您可以使用委派或NSNotifications,但两者都非常重要,并且会使控制流变得混乱。相反,您可以让助手从调用方接收一个块:
mynewHelperMethod:(id)obj with completionblock:^(id obj)aBlock