您可以从完成块更新您的类属性。在这种情况下,如果flag
是原子的,你可以更新它。但是,如果您正在设置其他任何内容(例如,从结果data
对象更新的任何对象属性),您可能希望将其分派回主队列以避免同步问题:
self.flag = NO;
[NSURLConnection sendAsynchronousRequest:mutURLRequest queue:opQueue completionHandler:^(NSURLResponse *response, NSData *data, NSError *error)
{
NSInteger statusCode = -1;
// to be safe, you should make sure `response` is `NSHTTPURLResponse`
if ([response isKindOfClass:[NSHTTPURLResponse class]])
{
NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse *)response;
statusCode = httpResponse.statusCode;
}
if (error)
{
// for diagnostic purposes only
NSLog(@"%s: sendAsynchronousRequest error: %@", __FUNCTION__, error);
}
if (error == nil && statusCode == 200)
{
[[NSOperationQueue mainQueue] addOperationWithBlock:^{
self.flag = YES;
// set any other class properties here
[[NSNotificationCenter defaultCenter] postNotificationName:@"MUITCheckinPostSucceeded" object:self userInfo:postDictionary];
}];
}
}];
我注意到您正在发布通知。如果您有多个视图控制器或模型对象监听该通知,那很好,并且通知是有意义的。但是,如果这段代码在视图控制器中并且该控制器是唯一关心结果的东西,那么您通常会放弃通知并直接从在该完成块中分派回主队列的代码开始更新 UI。
最后一个警告。对(或 ivars 的任何引用self
,其中隐含引用self
) 将在操作期间保持对该对象的强引用(即,它将保留它)。例如,如果您在网络操作正在进行时关闭视图控制器,则视图控制器将在网络操作完成之前不会被释放。这通常很好(因为它只是在连接期间......这不是可怕的强参考周期),尤其是对于学校作业。但如果这是一个问题,有一些技术只在完成块内使用对视图控制器的弱引用,从而防止在网络操作期间保留视图控制器。但这超出了您最初问题的范围(尤其是因为它会导致有关您是否要取消网络操作的一系列其他问题,