Browse Source

Merge pull request #1187 from lhnoah/master

解决因异步到主线程执行,造成self延时释放的问题
M了个J 7 years ago
parent
commit
2be5e51de0

+ 6 - 10
MJRefresh/Base/MJRefreshComponent.m

@@ -136,9 +136,7 @@ - (void)setState:(MJRefreshState)state
     _state = state;
     
     // 加入主队列的目的是等setState:方法调用完毕、设置完文字后再去布局子控件
-    dispatch_async(dispatch_get_main_queue(), ^{
-        [self setNeedsLayout];
-    });
+    MJRefreshDispatchAsyncOnMainQueue([self setNeedsLayout];)
 }
 
 #pragma mark 进入刷新状态
@@ -171,9 +169,7 @@ - (void)beginRefreshingWithCompletionBlock:(void (^)(void))completionBlock
 #pragma mark 结束刷新状态
 - (void)endRefreshing
 {
-    dispatch_async(dispatch_get_main_queue(), ^{
-        self.state = MJRefreshStateIdle;
-    });
+    MJRefreshDispatchAsyncOnMainQueue(self.state = MJRefreshStateIdle;)
 }
 
 - (void)endRefreshingWithCompletionBlock:(void (^)(void))completionBlock
@@ -228,7 +224,7 @@ - (void)setPullingPercent:(CGFloat)pullingPercent
 #pragma mark - 内部方法
 - (void)executeRefreshingCallback
 {
-    dispatch_async(dispatch_get_main_queue(), ^{
+    MJRefreshDispatchAsyncOnMainQueue({
         if (self.refreshingBlock) {
             self.refreshingBlock();
         }
@@ -238,7 +234,7 @@ - (void)executeRefreshingCallback
         if (self.beginRefreshingCompletionBlock) {
             self.beginRefreshingCompletionBlock();
         }
-    });
+    })
 }
 @end
 
@@ -267,8 +263,8 @@ - (CGFloat)mj_textWith {
 #else
         
         stringWidth = [self.text sizeWithFont:self.font
-                             constrainedToSize:size
-                                 lineBreakMode:NSLineBreakByCharWrapping].width;
+                            constrainedToSize:size
+                                lineBreakMode:NSLineBreakByCharWrapping].width;
 #endif
     }
     return stringWidth;

+ 2 - 6
MJRefresh/Base/MJRefreshFooter.m

@@ -60,9 +60,7 @@ - (void)willMoveToSuperview:(UIView *)newSuperview
 #pragma mark - 公共方法
 - (void)endRefreshingWithNoMoreData
 {
-    dispatch_async(dispatch_get_main_queue(), ^{
-        self.state = MJRefreshStateNoMoreData;
-    });
+    MJRefreshDispatchAsyncOnMainQueue(self.state = MJRefreshStateNoMoreData;)
 }
 
 - (void)noticeNoMoreData
@@ -72,9 +70,7 @@ - (void)noticeNoMoreData
 
 - (void)resetNoMoreData
 {
-    dispatch_async(dispatch_get_main_queue(), ^{
-        self.state = MJRefreshStateIdle;
-    });
+    MJRefreshDispatchAsyncOnMainQueue(self.state = MJRefreshStateIdle;)
 }
 
 - (void)setAutomaticallyHidden:(BOOL)automaticallyHidden

+ 3 - 3
MJRefresh/Base/MJRefreshHeader.m

@@ -67,7 +67,7 @@ - (void)scrollViewContentOffsetDidChange:(NSDictionary *)change
     }
     
     // 跳转到下一个控制器时,contentInset可能会变
-     _scrollViewOriginalInset = self.scrollView.mj_inset;
+    _scrollViewOriginalInset = self.scrollView.mj_inset;
     
     // 当前的contentOffset
     CGFloat offsetY = self.scrollView.mj_offsetY;
@@ -125,7 +125,7 @@ - (void)setState:(MJRefreshState)state
             }
         }];
     } else if (state == MJRefreshStateRefreshing) {
-         dispatch_async(dispatch_get_main_queue(), ^{
+        MJRefreshDispatchAsyncOnMainQueue({
             [UIView animateWithDuration:MJRefreshFastAnimationDuration animations:^{
                 CGFloat top = self.scrollViewOriginalInset.top + self.mj_h;
                 // 增加滚动区域top
@@ -137,7 +137,7 @@ - (void)setState:(MJRefreshState)state
             } completion:^(BOOL finished) {
                 [self executeRefreshingCallback];
             }];
-         });
+        })
     }
 }
 

+ 9 - 0
MJRefresh/MJRefreshConst.h

@@ -65,3 +65,12 @@ UIKIT_EXTERN NSString *const MJRefreshHeaderNoneLastDateText;
 MJRefreshState oldState = self.state; \
 if (state == oldState) return; \
 [super setState:state];
+
+// 异步主线程执行,不强持有Self
+#define MJRefreshDispatchAsyncOnMainQueue(x) \
+__weak typeof(self) weakSelf = self; \
+dispatch_async(dispatch_get_main_queue(), ^{ \
+typeof(weakSelf) self = weakSelf; \
+{x} \
+});
+