- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个应用程序在另一个线程上使用 NSStream 连接到服务器。如果用户决定注销,应用程序也会关闭连接。问题是我永远无法在用户断开连接后成功关闭流或线程。下面是关于如何为网络创建线程并尝试关闭流的代码示例:
+ (NSThread*)networkThread
{
static NSThread *networkThread = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
networkThread = [[NSThread alloc] initWithTarget:self selector:@selector(networkThreadMain:) object:nil];
[networkThread start];
});
return networkThread;
}
+ (void)networkThreadMain:(id)sender
{
while (YES)
{
@autoreleasepool {
[[NSRunLoop currentRunLoop] run];
}
}
}
- (void)scheduleInThread:(id)sender
{
[inputStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSRunLoopCommonModes];
[inputStream open];
}
- (void)closeThread
{
[inputStream close];
[inputStream removeFromRunLoop:[NSRunLoop currentRunLoop] forMode:NSRunLoopCommonModes];
[inputStream release];
inputStream = nil;
}
[self performSelector:@selector(scheduleInThread:) onThread:[[self class] networkThread] withObject:nil waitUntilDone:YES];
最佳答案
您混合静态变量和实例变量的方式令人困惑。你结婚就这样吗?如果你把它放在一个 NSOperation 中并使用一个 NSOperationQueue 运行它,我认为你会得到更清晰的封装。该操作将管理自己的异步线程,因此您不必这样做。另外,如果可以的话,我强烈建议使用 ARC。
几点注意事项:
#import <Foundation/Foundation.h>
NS_ASSUME_NONNULL_BEGIN
@interface AsyncStreamOperation : NSOperation
@end
NS_ASSUME_NONNULL_END
#import "AsyncStreamOperation.h"
@interface AsyncStreamOperation ()
@property (atomic, strong) AsyncStreamOperation *config;
@property (atomic, strong) NSInputStream *stream;
@property (atomic, assign, getter=isExecuting) BOOL executing;
@property (atomic, assign, getter=isFinished) BOOL finished;
@end
@implementation AsyncStreamOperation
@synthesize executing = _executing;
@synthesize finished = _finished;
- (instancetype)initWithStream:(NSInputStream *)stream
{
self = [super init];
if(self) {
_stream = stream;
}
return self;
}
- (BOOL)isAsynchronous
{
return YES;
}
- (BOOL)isExecuting
{
@synchronized (self) {
return _executing;
}
}
- (void)setExecuting:(BOOL)executing
{
@synchronized (self) {
[self willChangeValueForKey:@"isExecuting"];
_executing = executing;
[self didChangeValueForKey:@"isExecuting"];
}
}
- (BOOL)isFinished
{
@synchronized (self) {
return _finished;
}
}
- (void)setFinished:(BOOL)finished
{
@synchronized (self) {
[self willChangeValueForKey:@"isFinished"];
_finished = finished;
[self didChangeValueForKey:@"isFinished"];
}
}
- (void)start
{
// Get runloop
NSRunLoop *runLoop = [NSRunLoop currentRunLoop];
// Schedule stream
[self.stream scheduleInRunLoop:runLoop forMode:NSDefaultRunLoopMode];
[self.stream open];
// Loop until finished
// NOTE: If -cancel is not called, you need to add your own logic to close the stream so this loop ends and the operation completes
while(self.executing && !self.finished && !self.cancelled && self.stream.streamStatus != NSStreamStatusClosed) {
@autoreleasepool {
// Maximum speed once per second or CPU goes through the roof
[runLoop runMode:NSDefaultRunLoopMode beforeDate:[NSDate dateWithTimeIntervalSinceNow:1.0]];
}
}
self.executing = NO;
self.finished = YES;
}
- (void)cancel
{
[super cancel];
[self.stream close];
self.executing = NO;
self.finished = YES;
}
@end
关于ios - 如何在另一个线程上正确打开和关闭 NSStream,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10980874/
我想使用 nsstreams 发送和接收一些数据。我不想让我的代码如此困惑,所以我想知道: 我是否需要保留对 NSStream 的强引用,或者 [NSStream scheduleInRunLoop:
我正在将文件上传到服务器,使用 NSStream API 分块读取。我正在尝试显示一个显示上传进度的进度条。我无法找到可靠的解决方案来确定读入文件的字节数。更改文件和 block 大小,我仍然不断获取
我真的不能理解这个事件。 我希望在发送队列(或类似内部结构)发送完先前写入的数据包后调用它。 这是正确的假设吗? 我正在通过Multipeer连接开发视频流,我想使用此属性来决定是否应该放下摄像机框架
我有一个应用程序在另一个线程上使用 NSStream 连接到服务器。如果用户决定注销,应用程序也会关闭连接。问题是我永远无法在用户断开连接后成功关闭流或线程。下面是关于如何为网络创建线程并尝试关闭流的
在我正在开发的 iPad 应用程序中,我需要将网络处理放在一个单独的线程上,因为它偶尔会阻塞应用程序的 UI。目前,我已经创建了一个 Connection 对象,所有网络逻辑都在其中进行( NSStr
我正在尝试在 iOS 上编写 telnet 客户端,但无法正确设置流。我认为它们可以工作,但每次触发委托(delegate)方法时我都会得到空缓冲区。 以下是我设置流的方式: self.manager
我在 iOS 中进行客户端-服务器通信已经有一段时间了,但我遇到了一个我无法理解的问题。 我写了两个基本函数:一个向服务器发送数据,另一个从服务器接收数据。每个都有一个名为 timeout 的参数,它
我有一个连续打开的 TCP 连接,用于与外部设备通信。通信管道中发生了很多事情,导致 UI 有时变得无响应。 我想将通信放在一个单独的线程中。我了解 detachNewThread 以及它如何调用 @
在Ray Wenderlich tutorial on sockets为了从 Objective-C 中的输入流中读取字节,我们做了 uint8_t buffer[1024]; int
我在连接到服务器的 iphone 应用程序中有一个 NSInputStream 和一个 NSOutputStream。我能够毫无问题地将数据读取和写入套接字。问题是我有一个断开连接按钮,当我尝试在其中
如何同步调用NSStream获取结果?? 目前我在其委托(delegate)方法之一中收到异步回调 `(void)stream:(NSStream *)theStream handleEvent:(
全部, 我已经通过注释、断点等方式将它运行到这一点。程序在标记的代码处崩溃。 -(void) initNetworkCommunication { CFReadStreamRef readSt
我编写了一个程序,使用 Apple 流编程指南中概述的 NSStream 协议(protocol)连接到给定 IP 上的服务器。数据的连接和传输工作完美,但是如果用户指定了错误的 IP 并且程序尝试打
我有一个使用 NSStream 进行连接的客户端-服务器应用程序。有时,当尝试打开连接时,连接的一侧在第一次尝试发送消息时会收到 NSStreamEventEndEncountered。 我使用 CF
我正在尝试为 NSStream 编写包装器之类的东西,以使我的生活更轻松。我只想知道什么时候建立连接,什么时候关闭,写一些数据获取接收到的数据。所以我在想这样的事情: 标题: @interface S
我需要从家庭自动化服务器获取设备列表的状态。我要查询的设备在一个数组中。 我正在尝试循环遍历该数组,对于每个设备,我正在向服务器发送数据。我遇到的问题是服务器只收到一个包含我的 3 个命令的字符串。
一切都按预期工作,只是一步一步抛出调试器,否则我会得到 EXC_BAD_ACCESS。我想我需要在某个地方延迟或等待(最好)某件事。 // 1) Create streams(input/output
我正在使用 Objective-C 创建一个基于套接字的 iOS 应用程序,现在我的要求是同时连接到两个服务器。 我正在使用 NSInputStream 和 NSOutputStream,我能够连接到
使用ExternalAccessory与蓝牙设备通信,我使用EASession提供的输入和输出NSStreams向其发送消息。 在Apple的EADemo示例中,它将两个流调度到主线程的运行循环。但是
我正在使用 NSStream 通过 MCSession 发送大量的 UIImage 数据。 当我得到字节时 - (void)stream:(NSStream *)aStream handleEvent
我是一名优秀的程序员,十分优秀!