我在MacOSX应用程序(服务器)中使用CocoaHTTPServer,该应用程序提供本地映像目录。我有一个相应的iOS应用程序(客户端),它使用AFHTTPRequestOperation(AFNetworking)通过本地网络从Mac检索图像文件。这很有效。
我接下来想做的是,当用户在Mac应用程序中选择特定图像时,iPad应用程序会被通知下载该图像并显示它
我目前使用的方法是提供一个简单的imageToDisplay.txt文件,其中包括要显示的图像的文件名。iPad应用程序不断地轮询这个文件,如果文件名发生变化,它就会下载它,等等。它可以工作,但看起来很笨重。我曾想过在服务器上实现一个GET方法,该方法也会返回文件名。这种方法仍然需要客户端进行轮询。
有没有一种更优雅的方法可以用我已经准备好的片段触发下载(无需轮询)本质上是从服务器向客户端发送消息-"立即下载image27.jpg"
WebSockets(SocketRocket)
有几种方法可以实现这一点。正如评论中所指出的,WebSockets就是其中之一。适用于iOS的最健壮的免费WebSockets库是SocketRocket(押韵)。在我刚刚链接到的页面上有大量的示例(也有押韵的)代码,所以我不会在这里包含任何代码。
AF网络
由于您已经在使用AFNetworking,您还可以看看新的AFNetworking 2.0(即将发布),其中包括对通过Rocket实时联网的支持。
这将允许你的应用程序保持开放连接,看起来像这样:
[client SUBSCRIBE:@"/currentImage" usingBlock:^(NSArray *operations, NSError *error) {
for (AFJSONPatchOperation *operation in operations) {
switch (operation.type) {
case AFJSONReplaceOperationType:
// replace old image with new image
break;
default:
break;
}
}
} error:nil];
只要你的客户端没有取消,它就会继续从服务器接收更新。
您的服务器需要以适当的格式发送数据,Rack::Scaffold的一个实验分支可以做到这一点。
备注
如果你每周只改变一次自己的形象,这些方法可能会有些过头;在这种情况下,您应该缓存一个图像一段合理的时间。