AOperation 2.0.0

AOperation 2.0.0

Seyed Samad Gholamzadeh维护。



  • Seyed Samad Gholamzadeh

Swift 5 license MIT CocoaPods Compatible Platform codebeat badge Twitter Linkedin

AOperation是对Operation和OperationQueue类的包装,为它们的使用提供了更多功能。

特性

  • 支持声明性语法
  • 可以使用Combine
  • 易于使用
  • 有助于编写更短、更模块化的代码
  • 通过使用可重用操作和条件来防止代码重复
  • 非常灵活
  • 完全适应任何编程风格和架构

演示

TweetSeeker

这个演示是一个简单的应用,用于检索给定用户的推文。

当用户首次打开应用并输入用户名时,一个视图控制器会显示,请求注册。你应该注意到这个注册视图控制器不是作为视图控制器流程添加到应用中的,而是作为每个需要执行任务时执行授权的操作的条件来添加。这个条件将在操作添加到队列并准备执行时进行评估。条件评估流程如下。

每个条件可以有一个依赖操作,该操作将作为依赖项添加到入队操作中。依赖操作在条件评估之前执行和完成。对于此应用程序,AuthorizationConditionCheckAuthorizationOperation 作为依赖操作。CheckAuthorizationOperation 检查授权密钥是否不可用,将 RegisterationViewController 显示给用户请求授权。授权完成操作后,然后条件评估授权密钥是否现在可用。如果是可用的,条件评估将成功,否则将失败。

因此,当应用程序获得授权后,用户可以搜索输入用户名的推文。

检索推文和更新视图的代码以两种方式进行编写

仅使用 AOperation

		guard let username = sender.text, !username.isEmpty else { return }
		
		// We used AOperation to handle process of
		// fetching tweets
		
		// If there is an enqueued fetchOperation we cancel it
		// and creating a new fetch operation with the given new username
		fetchOperation?.cancel()
		
		// We set a delay before fetching tweets to make sure
		// the given username is the one user wants to fetch
		// tweets for.
		fetchOperation =
		DelayOperation<Void>(1)
			.deliver(to: MapOperationBlock<Void, String> { _, finish in
				finish(.success(username))
			})
			// Do not forget to use [weak self] if you referenced to self or any other reference type instance objects.
			.deliver(to: FetchUserTimeLineOperation()).didFinish { [weak self] (result) in
				guard let `self` = self else { return }
			switch result {
			case .success(let tweets):
				self.searchTextField.textColor = tweets.count > 0 ? #colorLiteral(red: 0, green: 0.4784313725, blue: 1, alpha: 1) : .black
				self.tweets = tweets

			case .failure:
				self.tweets = []
				self.searchTextField.textColor = .black
				return
			}
		}
		// Always call this method at the end of a chain to enqueue chain of operations
		.add(to: queue)

使用 Combine 的 AOperation

		// Here we used a combination of two AOperation and Combine
		// frameworks to fetching tweets
		// Notice to shortness and readablity of this bunch of codes
		cancellable =
			$searchedText
			.delay(for: 1, scheduler: RunLoop.main)
			.compactMap({ (text) -> String? in
				return text?.replacingOccurrences(of: " ", with: "")
			})
			.filter({!$0.isEmpty})
			.removeDuplicates()
			.deliver(to: FetchUserTimeLineOperation(), on: queue)
			.catch({ _ in Just([])})
			.assign(to: \.tweets, on: self)

审查和比较上述代码,以了解 AOperation 的强大功能,特别是与 Combine 一起使用时的功能。ReadMore

地震

第二个示例是一个简单的应用程序,显示了世界各地的近期地震。

当用户打开应用程序时,应用程序会检查 coredata 模型的可用性。如果是可用的,它将检索 coredata 数据并更新 UI,否则它将显示一个空白的视图列表。通过拉动到刷新 tableviewController,应用程序从互联网中检索新的地震数据并将其存储到 coredata 模型中,然后再次更新 UI。如果你点击每一行的地震,你会推进到一个新的视图控制器,该控制器显示有关地震的更多详细信息。例如,它会获取用户位置以显示地震与用户位置的距离。你还可以在此视图中分享地震信息。所有这些操作都是使用 AOperation 完成的。ReadMore

安装

CocoaPods

CocoaPods 是 Cocoa 项目的依赖管理器。您可以使用以下命令安装它:

$ gem install cocoapods

要使用 CocoaPods 将 AOperation 集成到您的 Xcode 项目中,请在其 Podfile 中指定它。

platform :ios, '10.0'
use_frameworks!

target '<Your Target Name>' do

    pod 'AOperation', '~> 2.0.0'
    
end

Swift Package Manager

Swift Package Manager 是一个用于自动化 Swift 代码分布的工具,集成了 swift 编译器。它处于早期开发阶段,但 Alamofire 支持在支持的平台使用它。

一旦您设置了您的 Swift 包,将 Alamofire 作为依赖项添加就像将它添加到您 Package.swiftdependencies 值一样简单。

dependencies: [
    .package(url: "https://github.com/ssamadgh/AOperation.git", .upToNextMajor(from: "2.0.0"))
]

手动操作

如果您不希望使用上述依赖管理器中的任何一个,可以手动将 AOperation 集成到您的项目中。

内嵌框架

  • 打开终端,使用 cd 命令进入您顶级项目目录,如果您项目未初始化为 Git 仓库,请运行以下命令:

    $ git init
  • 通过运行以下命令将 AOperation 作为 git 子模块 添加:

    $ git submodule add https://github.com/ssamadgh/AOperation.git
  • 打开新的 AOperation 文件夹,并将 AOperation.xcodeproj 拖动到应用 Xcode 项目的 Project Navigator 中。

    它应该位于应用蓝项目图标的下方。它是否在所有其他 Xcode 组之上或之下无关紧要。

  • 在 Project Navigator 中选择 AOperation.xcodeproj,并验证其部署目标与应用程序的部署目标一致。

  • 接下来,在 Project Navigator 中(蓝项目图标)选择您的应用项目,导航到目标配置窗口,并在侧边栏的 "Targets" 标题下选择应用程序目标。

  • 在窗口顶部的标签栏中,打开“通用”面板。

  • 在“嵌入的二进制文件”部分下单击 + 按钮。

  • 您将看到两个不同的 AOperation.xcodeproj 文件夹,每个文件夹中都有一个位于“Products”文件夹内的 AOperation.framework

    您可以选择任何 Products 文件夹。

  • 选择 AOperation.framework

  • 这就完成了!

    AOperation.framework 将自动添加为目标依赖项、链接框架和嵌入框架,在复制文件构建阶段,这是在模拟器和设备上构建所需的全部内容。

使用说明

使用 CheatSheet 快速回顾和训练 AOperation 的主要功能。否则,要深入理解 AOperation,请参考以下列表

致谢

AOperation 由 Seyed Samad Gholamzadeh 所有并维护。您可以在 Twitter 上关注我以获取项目的更新和发布信息:@ssamadgh

许可证

AOperation 在 MIT 许可证下发布。有关详细信息,参见 LICENSE